На выходных (где-то с месяц назад, когда я только взялся за этот пост) наконец-то дошли руки до публикации исходников своей «инфраструктурной» библиотеки. По правде говоря, я это собирался сделать достаточно давно, но насущной необходимости не было, да и сейчас наврядли кому-то понадобиться заточенная по большому счету под личные нужды одна из сотен тысяч других библиотек-собраний-всяких-мелочей, однако публикация исходников вместе со своими собственными 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 разработок.
Таким образом, всё, что необходимо изменить для публикации исходников:
- Секцию 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>
- добавить ключ Symbols к команде nuget pack (я обычно эту команду запускаю по событию AfterBuild в .csproj файле)
<Target Name="AfterBuild"> <GetAssemblyIdentity AssemblyFiles="$(TargetPath)"> <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" /> </GetAssemblyIdentity> <Exec Command=""$(SolutionDir).nuget\nuget" pack "$(SolutionDir).nuget\Av.Infrastructure.Web.nuspec" -Version %(CurrentAssembly.Version) -Prop Configuration=Release -Symbols -OutputDirectory "$(SolutionDir).nuget""> </Exec> </Target>
Собственно и всё! Детально и на английском можно прочитать у Дэвида Эббо, а о создании обычных нугет пакетов нагуглить во множестве мест :)
Успехов!