我正在从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
目标)?
答案 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
。