2017-10-10 81 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