使用自动包恢复来使用包含msbuild目标的nuget包

时间:2015-04-27 22:50:04

标签: visual-studio msbuild nuget nuget-package-restore msbuild-target

我正在根据nuget documentation创建一个包含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>

那就是'Not expected'行为是MSBuild集成的包恢复脚手架。

我按照documentation手动删除了这个脚手架,但是当我将项目提交给构建服务器时,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>

1 个答案:

答案 0 :(得分:0)

解决方案所在的文件夹是否包含.nuget文件夹?如果是这样,请尝试删除它。

我正在调整一个使用旧的(pre nuget 2.7)包恢复方式的解决方案,并且在删除该文件夹之前遇到了同样的问题。