2012-10-08 48 views
0

改變我已經建立了我的構建,這樣我可以在數通作爲構建屬性:強制構建時性質的MSBuild

msbuild MyProject.sln /t:Build /p:Configuration="Debug" /p:SomeNumber="123" 

的MSBuild項目生成一個文件,並通過將其添加:

<Compile Include="$(SomeFileContainingSomeNumber)" /> 

僅當指定了SomeNumber時纔會生成此文件。

當我更改或省略號碼並第二次構建時,MSBuild項目不會使用新值重建。我相信這是因爲沒有任何項目文件已經改變。

我如何建立我的項目,以改變SomeNumber屬性觸發重建?

+0

爲什麼不直接指定你想要的目標,例如'/ t:「Clean; Build」' –

+0

我想做增量構建。當只有一個C#文件發生更改時,我不想重建我的整個解決方案或整個項目。 –

回答

0

我正在使用MSBuild 3.5。似乎將Condition放在BeforeBuildTarget上會干擾其執行。當我將ConditionTarget移到目標中的單個動作時,我能夠獲得所需的行爲。

使用我能得到的MSBuild每次都正確編譯,將SomeNumber財產是否沒有改變以下。無論其內容是否已更改,該項目可能每次都重建SomeFile.cs,因爲其時間戳正在更改。

<PropertyGroup> 
    <SomeFile>SomeFile.cs</SomeFile> 
</PropertyGroup> 
<Target Name="BeforeClean"> 
    <Delete Files="$(SomeFile)" /> 
</Target> 
<Target Name="BeforeBuild"> 
    <WriteLinesToFile Condition="'$(SomeNumber)' == ''" File="$(SomeFile)" Lines="//" Overwrite="true" /> 
    <WriteLinesToFile Condition="'$(SomeNumber)' != ''" File="$(SomeFile)" Lines="$(SomeNumber)" Overwrite="true" /> 
</Target> 
<ItemGroup> 
    <Compile Include="$(SomeFile)" /> 
</ItemGroup> 

Lines="//"是必需的,因爲如果你把什麼或空格有WriteLinesToFile將刪除該文件。

+1

而不是寫「//」的文件,你可以看看[觸摸任務(http://msdn.microsoft.com/en-us/library/37fwbyt5.aspx) –