3

Я создаю пакет 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> 
+0

Вместо решения я придумал обходное решение. То есть, я создал еще один пакет nuget для устранения отсутствующего файла nuget.targets. При добавлении в проект этот новый пакет включает в себя цель, которая DependsOnTargets EnsureNuGetPackageBuildImports и создает пустые/действительные nuget.targets. Это удовлетворяет условию, вызванному из csproj scaffolding, в то же время позволяя запускать функцию автоматического восстановления пакета nuget на сервере сборки. – user1920322

ответ

0

В папке, в которой находится решение, есть папка .nuget? Если да, попробуйте удалить это.

Я настраиваю решение, использующее старый способ восстановления пакета (pre nuget 2.7), и имел ту же проблему, пока я не удалю эту папку.

Смежные вопросы