Продвинутое использование
NuGet и MSBuild
Игорь Лабутин, 13.04.2017
ilabutin@gmail.com
О себе
2
 16 лет в разработке ПО
 С/С++, Linux, QNX, Embedded
 Последние 9 лет – .NET (C#)
 Интересы
 Сети, протоколы обмена данными
 Проблемы производительности
 Сборка проектов и удобство разработчиков
О докладе
3
 NuGet
 Создание
 Использование
 MSBuild – написание собственного кода
 Как
 Зачем?!
 Всё это для VS 2015 & NuGet 3.5
О примере
4
 Детали
 Генерация XSD->C#
 Много ручной работы 
 Но можно автоматизировать (PreBuild)!
Посмотрим код
 Кратко
 Читаем XML
 Проверяем соответствие схеме (XSD)
 Пишем в консоль
Полезное – в NuGet
5
NuGet Server
DLLDLL
DLL
Другие
файлы
.nupkg
.nuspec
Project
DLLDLL
DLL
Другие
файлыПакуем
Результат
6
 Код чтения XML – в NuGet
 Но в основном проекте все еще нужно
использовать PreBuild Action
 VS не всегда корректно понимает
необходимость сборки
 DisableFastUpToDateCheck помогает, но
тогда сборка происходит чаще чем
хотелось
Помечтаем?
7
 Код чтения XML – в NuGet
 NuGet пакет можно использовать из VS UI
 Нет необходимости менять .csproj
вручную
 Конвертацию XSD в CS настраивается из
VS UI
 Сборка корректно учитывает состояние
файлов
Долой ручной труд
8
 Создаем свой собственный MSBuild
Target: TransformXsd2Cs
 Надо как-то знать список XSD файлов
 Добавляем в NuGet пакет
 buildSuperSerializer.targets
 Но как его оттуда вызывать…
Вызываем Target
9
 SuperSerializer.targets импортируется автоматически
 Для вызова можно использовать
 CallTarget
 DependsOnTargets
 BeforeTarget/AfterTarget
 Стараться использовать DependsOnTargets
 MSBuild для .csproj позволяет встраиваться почти
везде
<Target
Name=“Build” DependsOnTargets=“$(BuildDependsOn)”>
Применяем
Результат
10
 Код чтения XML – в NuGet
 NuGet пакет можно использовать из VS UI
 Нет необходимости менять .csproj
вручную
 Конвертацию XSD в CS настраивается из
VS UI
 Сборка корректно учитывает состояние
файлов
Настраиваем сборку
11
 MSBuild умеет понимать надо ли
собирать проект
 Но ему надо чуть-чуть подсказать
 Задаем Inputs/Outputs атрибуты у
TransformXsd2Cs
<Target
Name="TransformXsd2Cs“
Inputs="@(Xsd2Cs)“
Outputs="@(Xsd2Cs->'%(RootDir)%(Directory)%(Filename).cs')">
Всё в GUI
12
 Сообщаем VS что есть новый build
action
<ItemGroup>
<AvailableItemName Include="Xsd2Cs" />
</ItemGroup>
 Теперь можно не редактировать .csproj
Результат
Результат
13
 Код чтения XML – в NuGet
 NuGet пакет можно использовать из VS UI
 Нет необходимости менять .csproj
вручную
 Конвертацию XSD в CS настраивается из
VS UI
 Сборка корректно учитывает состояние
файлов
Последние штрихи
14
 Добавить readme.txt
 Без powershell не обойтись
 Добавляем buildinstall.ps1 для
модификации .csproj
Результат
Что дальше?
15
 Visual Studio 2017
 Новый формат .csproj
 Новый NuGet 4.0
 Нет поддержки install.ps1
 Кроссплатформенность
 .NET Standard
ilabutin@gmail.com
https://github.com/ilabutin/
@ilabutin
16

Игорь Лабутин «Продвинутое использование NuGet и MSBuild»

  • 1.
    Продвинутое использование NuGet иMSBuild Игорь Лабутин, 13.04.2017 ilabutin@gmail.com
  • 2.
    О себе 2  16лет в разработке ПО  С/С++, Linux, QNX, Embedded  Последние 9 лет – .NET (C#)  Интересы  Сети, протоколы обмена данными  Проблемы производительности  Сборка проектов и удобство разработчиков
  • 3.
    О докладе 3  NuGet Создание  Использование  MSBuild – написание собственного кода  Как  Зачем?!  Всё это для VS 2015 & NuGet 3.5
  • 4.
    О примере 4  Детали Генерация XSD->C#  Много ручной работы   Но можно автоматизировать (PreBuild)! Посмотрим код  Кратко  Читаем XML  Проверяем соответствие схеме (XSD)  Пишем в консоль
  • 5.
    Полезное – вNuGet 5 NuGet Server DLLDLL DLL Другие файлы .nupkg .nuspec Project DLLDLL DLL Другие файлыПакуем
  • 6.
    Результат 6  Код чтенияXML – в NuGet  Но в основном проекте все еще нужно использовать PreBuild Action  VS не всегда корректно понимает необходимость сборки  DisableFastUpToDateCheck помогает, но тогда сборка происходит чаще чем хотелось
  • 7.
    Помечтаем? 7  Код чтенияXML – в NuGet  NuGet пакет можно использовать из VS UI  Нет необходимости менять .csproj вручную  Конвертацию XSD в CS настраивается из VS UI  Сборка корректно учитывает состояние файлов
  • 8.
    Долой ручной труд 8 Создаем свой собственный MSBuild Target: TransformXsd2Cs  Надо как-то знать список XSD файлов  Добавляем в NuGet пакет  buildSuperSerializer.targets  Но как его оттуда вызывать…
  • 9.
    Вызываем Target 9  SuperSerializer.targetsимпортируется автоматически  Для вызова можно использовать  CallTarget  DependsOnTargets  BeforeTarget/AfterTarget  Стараться использовать DependsOnTargets  MSBuild для .csproj позволяет встраиваться почти везде <Target Name=“Build” DependsOnTargets=“$(BuildDependsOn)”> Применяем
  • 10.
    Результат 10  Код чтенияXML – в NuGet  NuGet пакет можно использовать из VS UI  Нет необходимости менять .csproj вручную  Конвертацию XSD в CS настраивается из VS UI  Сборка корректно учитывает состояние файлов
  • 11.
    Настраиваем сборку 11  MSBuildумеет понимать надо ли собирать проект  Но ему надо чуть-чуть подсказать  Задаем Inputs/Outputs атрибуты у TransformXsd2Cs <Target Name="TransformXsd2Cs“ Inputs="@(Xsd2Cs)“ Outputs="@(Xsd2Cs->'%(RootDir)%(Directory)%(Filename).cs')">
  • 12.
    Всё в GUI 12 Сообщаем VS что есть новый build action <ItemGroup> <AvailableItemName Include="Xsd2Cs" /> </ItemGroup>  Теперь можно не редактировать .csproj Результат
  • 13.
    Результат 13  Код чтенияXML – в NuGet  NuGet пакет можно использовать из VS UI  Нет необходимости менять .csproj вручную  Конвертацию XSD в CS настраивается из VS UI  Сборка корректно учитывает состояние файлов
  • 14.
    Последние штрихи 14  Добавитьreadme.txt  Без powershell не обойтись  Добавляем buildinstall.ps1 для модификации .csproj Результат
  • 15.
    Что дальше? 15  VisualStudio 2017  Новый формат .csproj  Новый NuGet 4.0  Нет поддержки install.ps1  Кроссплатформенность  .NET Standard
  • 16.

Editor's Notes

  • #5 Тут показать базовый солюшн с одним проектом и вручную сгенеренным C#. В этой же демо заменяем на prebuild action
  • #6 Демо создания базового пакета – конвертер уже в DLL, nuspec создать с нуля, запаковать, использовать в основном проекте (все еще нужно писать руками код). Показать пересборку и использование атрибута DisableFastUpToDateCheck
  • #10 Демо: Перенести в .targets, добавить Xsd2Cs itemgroup, включить в .nuspec, добавить builddependson. Сказать что есть еще .props, но они включаются раньше всех.
  • #13 Показать что если удалить из проекта .xsd и добавить его, то сразу доступен выбор и можно собрать (и добавить сгенеренный файл)
  • #15 Показать демо на новом солюшне