использовать пакет nuget, содержащий цели msbuild, с автоматическим восстановлением пакета

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

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


Ответы (1)


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

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

person rarrarrarrr    schedule 22.07.2015