在MSBuild中更改属性时强制构建

时间:2012-10-08 13:56:11

标签: msbuild

我已经设置了我的构建,以便我可以传入一个数字作为构建属性:

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

MSBuild项目生成一个文件并通过以下方式添加:

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

仅在指定SomeNumber时生成此文件。

当我更改或省略数字并再次构建时,MSBuild项目不会使用新值重建。我相信这是因为没有任何项目文件发生过变化。

如何设置项目以便更改SomeNumber属性会触发重建?

1 个答案:

答案 0 :(得分:0)

我正在使用MSBuild 3.5。似乎在Condition BeforeBuild上放置Target会干扰其执行。当我将ConditionTarget移动到目标中的各个操作时,我就能够获得所需的行为。

使用以下内容,无论SomeNumber属性是否发生更改,我都能够每次都正确编译MSBuild。该项目可能每次重建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会删除文件,如果你没有放任何内容或空格。