Dot-Net

MSBuild 中的 @ 和 $ 和 % 有什麼區別?

  • October 22, 2021

在 MSBuild 中引用變數時有什麼區別。例如在下面有一個@and$和 as well as a %used。

<Copy SourceFiles="@(Files)" DestinationFolder="$(TempBuildDir)\%(RecursiveDir)">
  <Output TaskParameter="CopiedFiles" ItemName="DeployFiles" />
</Copy>

$ 表示對屬性的訪問(某種包含簡單值的變數)

@ 用於項目,通常是一組帶有名稱下附加元數據的文件

% 表示對項目元數據的訪問。有眾所周知的元數據(如 RecursiveDir,請參閱 msdn 中的定義)自動附加到項目,或者您可以在定義項目時附加自己的元數據

假設您像這樣定義@(files):

<ItemGroup>
  <Files include='c:\source\**\*.*'>  <!-- all files in all subfolder in c:\source -->
    <Color>Blue</Color> <!-- attach metadata color = 'Blue' to these files -->
  </Files>
  <Files include='c:\source2\**\*.*'>  <!-- all files in all subfolder in c:\source2 -->
    <Color>Red</Color> <!-- attach metadata color = 'Red' to these files -->
  </Files>
</ItemGroup>

如果 c:\source 包含文件 1.txt、b/2.dll、c/3.xml,並且 c:\source2 包含 a/4.exe,則 ​​@(Files) 形成如下

  • 文件 c:\source\1.txt,元數據顏色 = ‘Blue’ 和 RecursiveDir = '’
  • 文件 c:\source\b\2.dll,元數據顏色 = ‘Blue’ 和 RecursiveDir = ‘b’
  • 文件 c:\source\c\3.xml,元數據顏色 = ‘Blue’ 和 RecursiveDir = ‘c’
  • 文件 c:\source2\a\4.exe,元數據顏色 = ‘Red’ 和 RecursiveDir = ‘a’

如果你這樣定義 TempBuildDir

<PropertyGroup>
<TempBuildDir>c:\temp<TempBuildDir>
</PropertyGroup>

您有某種包含簡單值的變數:c:\temp

您的範例如下所示:將 item File 中定義的每個文件複製到一個目錄中,該目錄由變數 TempBuildDir 的值與您找到該文件的 Recursive 目錄連接而成。

你最終得到:

  • c:\temp\1.txt
  • c:\temp\b\2.dll
  • c:\temps\c\3.xml
  • c:\temp\a\4.exe

引用自:https://stackoverflow.com/questions/6446018