Dot-Net
MSBuild 中的 @ 和 $ 和 % 有什麼區別?
在 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