Я создаю пакет nuget, который будет содержать файлы MSBuild .targets и .props согласно документация по nuget (требуется nuget 2.5+).
Я собираюсь использовать его с автоматическим восстановлением пакета.
Когда я добавляю полученный пакет в csproj, происходят две вещи:
Как и ожидалось:
<Import Project="..\packages\MyPackage.1.0.0\build\net40\MyPackage.props" Condition="Exists('..\packages\MyPackage.1.0.0\build\net40\MyPackage.props')" />
...
...
<Import Project="..\packages\MyPackage.1.0.0\build\net40\MyPackage.targets" Condition="Exists('..\packages\MyPackage.1.0.0\build\net40\MyPackage.targets')" />
Неожиданно:
<PropertyGroup>
<RestorePackages>true</RestorePackages>
...
</PropertyGroup>
...
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
...
</Target>
Это «Не ожидаемое» поведение - это шаблон восстановления пакета, интегрированный в MSBuild.
Я удалил эти леса вручную в соответствии с документацией но когда я отправляю проект на сервер сборки, кажется, что automaitc-package-restore снова добавляет скаффолдинг, что приводит к сбою сборки.
This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is D:\TFSBuilds\...\.nuget\NuGet.targets.
Есть ли у кого-нибудь способ заблокировать / предотвратить включение этого каркаса, когда пакет включает цели msbuild?
обновить
Вместо решения я попробовал обходной путь. То есть я создал еще один пакет nuget, чтобы исправить отсутствующий файл nuget.targets. При добавлении в проект этот новый пакет сам включает цель, которая DependsOnTargets EnsureNuGetPackageBuildImports и создает пустой / действительный nuget.targets. Это удовлетворяет условию, запускаемому из шаблонов csproj, позволяя при этом запускать функцию автоматического восстановления пакета nuget на сервере сборки.
<Target Name="NuGetPackAutomaticPackageRestorePreBuildWorkaround" BeforeTargets="EnsureNuGetPackageBuildImports" Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')">
<ItemGroup>
<PatchTargets Include="$(MSBuildThisFileDirectory)TargetPatches\*.targets"/>
</ItemGroup>
<Copy
SourceFiles="@(PatchTargets)"
DestinationFolder="$(SolutionDir)\.nuget\"/>
</Target>