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

如何在独立MSBuild脚本中使用NuGet目标,而无需单独调用还原目标,msbuild,nuget-package-restore,Msbuild,Nuget Package Restore,我正在从bat脚本调用不是csproj的MSBuild脚本。我希望该脚本能够使用,我不想在每台机器上都安装它,也不想在我的repo中包含它的二进制文件 通过将这些节点添加到脚本并调用restore目标,包将恢复 <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <ItemGroup> <PackageReference Include="MSBuildTasks">

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

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

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

但是,在我第一次运行脚本时,程序包会恢复,但是脚本失败,因为它找不到
AssemblyInfo
任务。第二次,它成功了。是否有任何方法可以在不调用MSBuild脚本两次(第一次,特别是运行
还原
目标)的情况下使其正常工作?

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


根据具体情况(解决方案构建、项目引用),如果没有
Properties=“Foo=Bar”
部分,它可能会工作,也可能不会工作


但是,请注意,这有点危险,因为甚至不能使用
msbuild
任务上的参数清除所有msbuild缓存。MSBuild 15.5将添加一个
/restore
开关,该开关将执行
restore
目标,清除所有必要的缓存,然后执行其他请求的工作。因此,在15.5中,您应该能够毫无困难地调用
msbuild/restore/t:MyTarget

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


根据具体情况(解决方案构建、项目引用),如果没有
Properties=“Foo=Bar”
部分,它可能会工作,也可能不会工作

但是,请注意,这有点危险,因为甚至不能使用
msbuild
任务上的参数清除所有msbuild缓存。MSBuild 15.5将添加一个
/restore
开关,该开关将执行
restore
目标,清除所有必要的缓存,然后执行其他请求的工作。因此,在15.5中,您应该能够毫无困难地调用
msbuild/restore/t:MyTarget

<Target Name="MyTarget" DependsOnTargets="Restore">
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="$(VersionInfoFile)"
                  AssemblyVersion="1.2.3.5"
                  />
</Target>
<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>