Comments 4
добавлю для несведущих, что имя
<package>.props
должно строго совпадать с именем выпускаемого пакетая бы добавил
<ItemGroup Condition="'$(_IsExecutable)' == 'true'">
для копирования файловых ресурсов только в "конечные" исполняемые проекты (в том числе тесты) а не во все промежуточные ClassLibrary, где они используютсямагию создания пакетов можно применять и без
nuspec
.dotnet pack
в большинстве случаев все делает сам. рекомендую посмотреть в сторону свойстваIsPackable
при создании data пакетов магией
dotnet pack
обратите внимание на свойстваIncludeBuildOutput
иSuppressDependenciesWhenPacking
просмотр свойств - рекомендую собрать проект из командной строки с ключиком
-bl
и воспользоваться замечательным инструментомMSBuild Structured Log Viewer
вопрос скорее религии, но для создание артефактов проекта я агитирую за
dotnet publish
иdotnet pack
а не создавать артефакты при каждой сборке проекта, так как придерживаюсь позиции, что сборка должна происходить как можно быстрее для уменьшения требуемого времени для запуска юнит тестов.
Спасибо за ценные дополнения. Попробую применить на практике.
По п. 3 и 4 - пытался выставить IncludeBuildOutput, SuppressDependenciesWhenPacking и IsPackable в true и собрать пакет без props и nuspec. Файлы в пакет так и не попали. Возможно я пропустил какой-то важный нюанс. Надо будет на досуге еще раз попытаться с ними все сделать.
П. 6 - абсолютно с вами согласен. В примере пакеты собираются при сборке для простоты.
test.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsPackable>true</IsPackable>
<IncludeBuildOutput>false</IncludeBuildOutput>
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
</PropertyGroup>
<ItemGroup>
<Content Include="$(MSBuildThisFileFullPath)" Pack="true" PackagePath="none\$(PackageId).props" PackageCopyToOutput="true" CopyToOutputDirectory="Always"/>
</ItemGroup>
</Project>
и на нем dotnet pack
не скажу уже точно по какой причине, но всегда включаю и
build
иbuildTransitive
причем из второго запускаю импорт первого, а само копирование делаю именно вbuild
. ВозможноbuildTransitive
не запускается если пакет подключен непосредственно к "исполняемому проекту".Есть еще некоторое "неудобство" предложенного решения. Если подключить такой проект, например, к юнит тесту в этом же solution как project reference, то в целевом каталоге не будет нужных артефактов. Они появятся только при подключении как packageReference, т.е. нужно будет использовать какой-то, например локальный, репозиторий пакетов.
Добавление файлов контента в nuget-пакетах