簡體   English   中英

從msbuild中的命令行導入.targets文件

[英]Import .targets file from command line in msbuild

我目前正在使用msbuild構建多個項目。 我對由.targets文件處理的構建進行了一個小的自定義。 一種解決方案是添加代碼段

<Import Project="MyTargets.targets"/>

到每個項目文件。 但是,理想情況下我不想觸摸項目文件,並能夠將此信息作為參數傳遞給msbuild。 這樣我就可以輕松控制是否從命令行運行此自定義, 而且我不必觸摸現有的項目文件。

這可能嗎?

您可以使用MSBuild 4.0輕松完成此操作(通過頂級屬性ToolsVersion =“4.0”檢查您的版本):

在加載Common.targets和/或CSharp.targets之前和之后,可以使用多個屬性來導入目標。

最簡單的方法是使用2組自解釋屬性。 第一套是:$(CustomBeforeMicrosoftCommonTargets)$(CustomAfterMicrosoftCommonTargets)

第二個:

$(CustomBeforeMicrosoftCSharpTargets)
$(CustomAfterMicrosoftCSharpTargets)

屬性名稱非常自我解釋。

只需通過msbuild.exe將完整文件名傳遞給任何此屬性即可

msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets=c:\mytargets\custom.targets

如果需要導入多個文件,可以使用其他“ImportByWildcard(Before | After)....”屬性。 但在這種情況下,您需要將更多參數傳遞給命令行。

從MSBuild 15.0開始,以下兩個文件將自動導入到您的構建中,以防它們在項目路徑或根目錄路徑上的任何父文件夾中找到:

  • Directory.Build.props
  • Directory.Build.targets

備注:一旦找到道具或目標文件,MSBuild將停止尋找父項。

另請參閱: https//docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build

假設您有一個名為“Project.msbuild”的項目文件。 您將添加此條件導入:

<Import Project="$(TargetToImport)" Condition="'$(TargetToImport)' != ''" />

然后將要導入的目標文件的名稱作為msbuild屬性傳遞:

msbuild.exe Project.msbuild /p:TargetToImport="TargetFile.Target"

確保使用目標文件的絕對路徑 ,它可以工作。
來源: Sayed Ibrahim Hashimi - MSBuild如何在CoreCompile第2部分之后執行目標

msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets="c:\mytargets\custom.targets" /preprocess:out.xml

使用/preprocess[:filepath]查看導入的結果。

您不必修改任何csprojvbproj文件。
當然,它只適用於您可以設置MSBuild屬性的地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM