Как стать автором
Обновить

Комментарии 4

  1. добавлю для несведущих, что имя <package>.props должно строго совпадать с именем выпускаемого пакета

  2. я бы добавил <ItemGroup Condition="'$(_IsExecutable)' == 'true'"> для копирования файловых ресурсов только в "конечные" исполняемые проекты (в том числе тесты) а не во все промежуточные ClassLibrary, где они используются

  3. магию создания пакетов можно применять и без nuspec. dotnet pack в большинстве случаев все делает сам. рекомендую посмотреть в сторону свойства IsPackable

  4. при создании data пакетов магией dotnet pack обратите внимание на свойства IncludeBuildOutput и SuppressDependenciesWhenPacking

  5. просмотр свойств - рекомендую собрать проект из командной строки с ключиком -bl и воспользоваться замечательным инструментом MSBuild Structured Log Viewer

  6. вопрос скорее религии, но для создание артефактов проекта я агитирую за 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

  1. не скажу уже точно по какой причине, но всегда включаю и build и buildTransitive причем из второго запускаю импорт первого, а само копирование делаю именно в build. Возможно buildTransitive не запускается если пакет подключен непосредственно к "исполняемому проекту".

  2. Есть еще некоторое "неудобство" предложенного решения. Если подключить такой проект, например, к юнит тесту в этом же solution как project reference, то в целевом каталоге не будет нужных артефактов. Они появятся только при подключении как packageReference, т.е. нужно будет использовать какой-то, например локальный, репозиторий пакетов.

Спасибо за пример!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий