2016-12-02 46 views
0

我有一個包含在NMakeBuildCommandLine部分明確的Windows shell命令的vcxproj文件:代碼重用文件的存在測試在Visual Studio中vcxproj文件

<NMakeBuildCommandLine Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> 
move file1 file2 
</NMakeBuildCommandLine> 

我使用的MSBuild執行vcxproj,直接或通過sln文件。問題是,當file1不存在,輸出是非常無益的,甚至沒有列出該文件的名稱:

The system cannot find the file specified. 

我天真的解決方案是,以取代move file1 file2

if exist file1 (move file1 file2) else (echo file1 does not exist &amp;&amp; exit 1) 

(注我需要寫&amp;&amp;而不是&&。)

這工作,但因爲我需要在每行file1三次,並確保他們的所有比賽是容易出錯。 file1只是需要移動的許多文件之一。而且,各種構建配置中的一系列命令實際上是相同的。

如何避免這兩個命令行內和跨構建配置重複自己?我認爲UserMacros屬性組可能會幫助我,但我無法弄清楚如何通過IDE編寫這樣的宏。 (右鍵單擊Visual Studio中的項目不會顯示用於輸入用戶宏的字段。)我也無法在Internet上找到關於此部分語法的任何討論,所以我不知道如何使用文本編輯器(我真的更喜歡)。

在vcxproj文件中可能還有一種更好的方法來識別需要存在的文件,所以我對任何選擇都是開放的。

+1

可能是最好的開始查找如何使用屬性MSBuild的。在文本編輯器中打開vcxproj,將 path/to/file添加到PropertyGroup,然後使用'if exists $(file1)...'? – stijn

+0

@stijn,這是我正在尋找的信息。有用。如果你把它作爲答案,我會upvote它和(除非有更好的出現)選擇它。謝謝! – Alan

回答

1

與大多數其他編程語言properties一樣,MsBuild具有「變量」。您在項目文件xml中的PropertyGroup元素中聲明一個元素,然後使用$(PropertyName)語法重新使用它。爲您的案例:

<PropertyGroup> 
    <Src>/path/to/my/src</Src> 
    <Dst>/path/to/my/dst</Dst> 
</PropertyGroup> 

<NMakeBuildCommandLine> 
if exist $(Src) (move $(Src) $(Dst)) else (echo $(Src) does not exist &amp;&amp; exit 1) 
</NMakeBuildCommandLine> 

如果你想使用的IDE,如果你有很多的值可能變得單調而乏味,你的確可以使用所謂的UserMacros但你必須聲明那些在proprty片。轉到視圖 - >物業經理,右鍵單擊您的項目,然後選擇「添加新的物業表」。雙擊它,進入「用戶宏」並在那裏添加鍵/值對。如果保存所有內容並查看生成的文件,現在可以看到vcxproj導入propertysheet,而屬性表本身具有PropertyGroup,就像上面顯示的那樣 - 但是可以通過IDE進行編輯。

作爲一種可能更好(減少重複,更容易自動化)的替代方案,您可以使用MsBuild代碼來檢查文件存在和移動文件,這有益於您只需編寫移動命令一次可以有MsBuild loop超過items。這些是在ItemGroup中聲明的。這裏解釋一切是有點出入的範圍,但一個例子應該把事情說清楚:

<Target Name="BatchMove"> 
    <ItemGroup> 
    <SrcFiles Include="file1"> 
     <Dest>file2</Dest> 
    </SrcFiles> 
    <SrcFiles Include="file3"> 
     <Dest>file4</Dest> 
    </SrcFiles> 
    </ItemGroup> 
    <Warning Text="Source file %(SrcFiles.Identity) does not exist" Condition="!Exists(%(SrcFiles.Identity))" /> 
    <Move SourceFiles="%(SrcFiles.Identity)" DestinationFiles="%(SrcFiles.Dest)" Condition="Exists(%(SrcFiles.Identity))" /> 
</Target> 

這聲明2的源文件文件1 /文件3和它們各自的目標文件的文件2 /文件4。如果源不存在(使用標準的MsBuild Exists檢查),則會顯示一條消息,否則會將其移至目標。這些%字符將使它們出現的行循環遍歷SrcFiles集合的每個元素。要添加更多文件,只需添加到ItemGroup。最後一步是讓這個目標從通過調用文件本身的MSBuild並告訴它運行目標做簡單的NMAKE命令行調用:

<NMakeBuildCommandLine> 
msbuild $(MSBuildThisFile) /t:BatchMove 
</NMakeBuildCommandLine> 
相關問題