Обработайте ProjectReference как PackageReference или разрешите PackageReference для локального csproj
У меня есть netstandard2.0 csproj (назовем его MyPackage), который упакован во время сборки (как указано в GeneratePackageOnBuild) в пакет nuget. Этот пакет nuget имеет пользовательские реквизиты и цели в каталоге сборки (поэтому ссылки на проекты получают их импортированные).
У меня есть другой проект (назовем его MyConsumer) в том же решении для тестирования MyPackage. Я хочу, чтобы во время сборки MyConsumer импортировал реквизиты и цели ресурсов сборки из MyPackage, как если бы он использовал его в качестве PackageReference из какого-либо удаленного источника nuget.
Как я могу заставить это работать (наиболее просто)?
Я смог сделать это с помощью очень сложного метода, в котором MyConsumer добавил PackageReference в MyPackage и переопределил RestoreSources в MyConsumer, чтобы он указывал на каталог bin MyPackage. Это становится очень странным, когда выполняется сборка dotnet или сборка Visual Studio для sln, поскольку метаданные проекта генерируются заранее для всех проектов во время восстановления, и, таким образом, MyPackage в этот момент не существует. Было решено добавить вложенные вызовы в MSBuild в рамках проекта MyConsumer, но тогда это стало еще хуже, поскольку восстановление Visual Studio работает совершенно иначе, чем автоматическое восстановление, выполняемое сборкой dotnet.
Есть ли простой способ сделать это?
Вот что у меня сейчас
<Project>
<Target Name="Build">
<Message Text="Running inner build" Importance="high" />
<!--
Need to call MSBuild twice, once to restore, then again to restore and build to get the restore of the Sdk to work
because of this bug in MSBuild: https://github.com/Microsoft/msbuild/issues/2455
Note the trailing Prop=1 is required to get MSBuild to invalid it's cache of the project target imports
-->
<MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Restore" Properties="Configuration=$(Configuration);Version=$(Version);IsInnerBuild=true;Prop=1" />
<!-- Have to use dotnet build instead of another call to MSBuild because of another bug that prevents proper imports within the same physical process -->
<Exec Command="dotnet build /p:Configuration=$(Configuration) /p:Version=$(Version) /p:IsInnerBuild=true" />
<Message Text="Finished inner build" Importance="high" />
</Target>
<Target Name="Restore" />
<Target Name="RemoveBin">
<RemoveDir Directories="bin" />
</Target>
<!-- Don't do real cleans old rebuild since it breaks MSBuild due to the same above bug -->
<Target Name="Rebuild" DependsOnTargets="RemoveBin;Build">
</Target>
</Project>
1 ответ
Обработайте ProjectReference как PackageReference или разрешите PackageReference для локального csproj
Если я правильно вас понял, вы хотите сгенерировать пакет с проектом MyPackage
, затем установите его в тестовый проект MyConsumer
и импортируйте реквизиты и цели ресурсов сборки из MyPackage во время сборки.
Для достижения этой цели вам необходимо выполнить следующие несколько вещей:
- Убедитесь, что проект
MyPackage
построить перед проектомMyConsumer
, - Установите пакет в источник упаковщика
- Добавить пакет
MyPackage.nupkg
к тестовому проектуMyConsumer
во время сборки.
Детали для выше:
- Убедитесь, что проект
MyPackage
построить перед проектомMyConsumer
,
Так как вы хотите протестировать пакет, сгенерированный проектом MyConsumer
Вы должны убедиться, что этот пакет работает перед тем, как использовать тестовый проект, поэтому нам нужно установить проект MyConsumer
ссылка на проект MyPackage
,
- Установите пакет в источник упаковщика
Вы можете использовать событие после сборки для проекта MyPackage
скопировать посылку MyPackage.nupkg
в локальный канал, или вы можете просто добавить каталог bin MyPackage.nupkg
к источнику пакета.
- Добавить пакет
MyPackage.nupkg
к тестовому проектуMyConsumer
во время сборки.
Используя VS 2017 и PackageReference
стиль тестового проекта MyConsumer
Вы можете установить Directory.Build.props
файл в корне вашего решения, содержащий тестовый проект MyConsumer
тебе нужно:
<Project>
<ItemGroup>
<PackageReference Include="MyPackage" Version="1.0.* />
</ItemGroup>
</Project>
Это добавит эти пакеты NuGet в тестовый проект MyConsumer
в решении он будет использоваться в качестве PackageReference из некоторого удаленного источника nuget.
Посмотрите ответ Мартина для получения более подробной информации.
Надеюсь это поможет.