如何在独立的MSBuild脚本中使用NuGet目标,而无需单独调用Restore目标

时间:2017-10-10 15:55:53

标签: msbuild nuget-package-restore

我正在从bat脚本调用一个不是csproj的MSBuild脚本。我希望该脚本能够使用MSBuild Community Tasks,我不想在每台机器上安装它,也不想在我的仓库中包含它的二进制文件。

通过将这些节点添加到脚本并调用restore目标,程序包将恢复。

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<ItemGroup>
  <PackageReference Include="MSBuildTasks">
    <Version>1.*</Version>
  </PackageReference>
</ItemGroup>

要使用它包含的任务,我只需要使用它们。我不需要导入任何其他targets个文件:

<Target Name="MyTarget" DependsOnTargets="Restore">
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="$(VersionInfoFile)"
                  AssemblyVersion="1.2.3.5"
                  />
</Target>

但是,第一次运行脚本时,程序包会恢复,但脚本会因为无法找到AssemblyInfo任务而失败。第二次,它成功了。有没有办法让它在没有调用MSBuild脚本两次的情况下工作(第一次,特别是运行Restore目标)?

1 个答案:

答案 0 :(得分:2)

您可以使用具有不同全局属性集({)的<MSBuild>任务从自身调用msbuild文件来强制重新评估NuGet生成的导入。

<Target Name="MyTarget" DependsOnTargets="Restore">
    <MSBuild Projects="$(MSBuildProject)" Targets="MyTargetCore" Properties="Foo=Bar" />
</Target>

<Target Name="MyTargetCore">
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="$(VersionInfoFile)"
                  AssemblyVersion="1.2.3.5"
                  />
</Target>

根据具体情况(解决方案构建,项目引用),如果没有Properties="Foo=Bar"部分,它可能有效,也可能无效。

但请注意,这有点冒险,因为并非所有msbuild缓存都可以使用MSBuild任务上的参数进行清除。 MSBuild 15.5将添加一个/restore开关,它将执行Restore目标,清除所有必要的缓存,然后执行其他请求的工作。因此,在15.5中,您应该可以毫无困难地致电msbuild /restore /t:MyTarget