2017-10-10 36 views
0

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

回答

1

您可以使用<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