如何在独立的MSBuild脚本中使用NuGet目标,而无需单独调用恢复目标
问题描述:
我正在从bat脚本中调用一个不是csproj
的MSBuild脚本。我希望该脚本能够使用MSBuild Community Tasks,我不希望将其安装在每台机器上,也不希望将其二进制文件包含在我的回购中。如何在独立的MSBuild脚本中使用NuGet目标,而无需单独调用恢复目标
通过将这些节点添加到脚本中并调用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
目标)?
答
您可以使用<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
。