Я создаю пакет nuget, который будет содержать файлы MSBuild .targets и .props в соответствии с nuget documentation (требуется nuget 2.5+).потребляет пакет nuget, содержащий цели msbuild с автоматическим восстановлением пакетов
Я намерен использовать его для автоматического восстановления пакетов.
Когда я добавляю полученный пакет к 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 восстанавливает строительные леса.
Я удалил эти леса вручную в соответствии с documentation, но когда я отправляю проект на сервер сборки, появляется сообщение autoaitc-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 scaffolding, в то же время позволяя запускать функцию автоматического восстановления пакета 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>
Вместо решения я придумал обходное решение. То есть, я создал еще один пакет nuget для устранения отсутствующего файла nuget.targets. При добавлении в проект этот новый пакет включает в себя цель, которая DependsOnTargets EnsureNuGetPackageBuildImports и создает пустые/действительные nuget.targets. Это удовлетворяет условию, вызванному из csproj scaffolding, в то же время позволяя запускать функцию автоматического восстановления пакета nuget на сервере сборки. – user1920322