Публикация исходников вместе с nuget — плюс исходники Av.Infrastructure.Web

На выходных (где-то с месяц назад, когда я только взялся за этот пост) наконец-то дошли руки до публикации исходников своей «инфраструктурной» библиотеки. По правде говоря, я это собирался сделать достаточно давно, но насущной необходимости не было, да и сейчас наврядли кому-то понадобиться заточенная по большому счету под личные нужды одна из сотен тысяч других библиотек-собраний-всяких-мелочей, однако публикация исходников вместе со своими собственными nuget-пакетами таки может кому-нибудь пригодиться.

Если кто-то не в курсе, то VisualStudio предоставляет очень удобный способ просмотра/дебага кода подключенных библиотек, а иногда и самого .net framework :)
Включается это очень просто: в Tools->Options->Debugging нужно снять галочку с опции Enable Just My Code и поставить — в Enable Source server support

Менеджер пакетов nuget интегрируется с поставщиком исходников SymbolSource — так что для получения исходных кодов необходимо настоить VS на работу с SymbolSource, для этого нужно добавить сервер http://srv.symbolsource.org/pdb/Public в список в Tools->Options->Debugging->Symbols

В своем рабочем окружении я обычно всё-таки включаю Enable Just My Code, чтобы дебаг не спускался в подключенные библиотеки (это нужно нечасто, и проще временно отключать эту галку на подобные случаи), а также настраиваю VS на получение символов только для необходимых мне библиотек (в Tools->Options->Debugging->Symbols на скриншоте выбран пункт Only Specified Modules и по ссылке Specify modules добавлены имена библиотек, для которых мне интересны исходники) — в противном случае загрузка исходников библиотек достаточно сильно влияет на скорости работы VS в дебаге (хоть загруженные исходники и кэшируются локально)

Возвращаясь к публикации исходников для собственных nuget-пакетов, надо сказать, что никакой сложности это не представляет. Необходимо всего-лишь в уже существующий nuspec-файл добавить pdb-символы (в папку lib) и ссылки на исходные коды (в папку src). Важным моментом, на котором я лично слегка застрял, была необходимость включения всех значимых файлов (в моем случае проблема была в невключенных .cshtml-шаблонах) в папку src.
При генерации nupkg файла командой nuget pack придется добавить ключ -Symbols (nuget pack -Symbols), в результате которого вместо одного nupkg-пакета получился два:

  • Packagename.nupkg — типичный nuget-пакет, исходных кодов и .pdb файлов в нем не будет!
  • Packagename.symbols.nupkg — пакет с исходниками, который будет отправлен на сервера SymbolSource

Стандартная команда nuget push отправит оба файла по своим назначениям, и все потребители вашего nuget пакета смогут с легкостью прямо из VisualStudio ознакомится с вашими исходниками (путем вызова GoTo Definition на любой функции вашей библиотеки) и даже отдебажить их в поиске ошибок. Очень удобный вариант для open-source разработок.

Таким образом, всё, что необходимо изменить для публикации исходников:

  1. Секцию files nuspec-файла: добавить исходники и .pdb. При добавлении исходников можно очень удобно использовать wildcard’ы, например:
    <files>
        <file src="..\Infrastructure.Site\bin\Release\AV.Infrastructure.Site.dll" target="lib" />
        <file src="..\Infrastructure.Site\bin\Release\AV.Infrastructure.Site.pdb" target="lib" />
        <file src="..\Infrastructure.Site\**\*.cs" target="src\Infrastructure.Site" />
        <file src="..\Infrastructure.Site\**\*.cshtml" target="src\Infrastructure.Site" />
      </files>
    
  2. добавить ключ Symbols к команде nuget pack (я обычно эту команду запускаю по событию AfterBuild в .csproj файле)
      <Target Name="AfterBuild">
        <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
          <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
        </GetAssemblyIdentity>
        <Exec Command="&quot;$(SolutionDir).nuget\nuget&quot; pack &quot;$(SolutionDir).nuget\Av.Infrastructure.Web.nuspec&quot; -Version %(CurrentAssembly.Version) -Prop Configuration=Release -Symbols -OutputDirectory &quot;$(SolutionDir).nuget&quot;">
        </Exec>
      </Target>
    

Собственно и всё! Детально и на английском можно прочитать у Дэвида Эббо, а о создании обычных нугет пакетов нагуглить во множестве мест :)

Успехов!

Опубликовать в Facebook
Опубликовать в Google Plus

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *