我已经设置了我的构建,以便我可以传入一个数字作为构建属性:
msbuild MyProject.sln /t:Build /p:Configuration="Debug" /p:SomeNumber="123"
MSBuild项目生成一个文件并通过以下方式添加:
<Compile Include="$(SomeFileContainingSomeNumber)" />
仅在指定SomeNumber
时生成此文件。
当我更改或省略数字并再次构建时,MSBuild项目不会使用新值重建。我相信这是因为没有任何项目文件发生过变化。
如何设置项目以便更改SomeNumber
属性会触发重建?
答案 0 :(得分:0)
我正在使用MSBuild 3.5。似乎在Condition
BeforeBuild
上放置Target
会干扰其执行。当我将Condition
从Target
移动到目标中的各个操作时,我就能够获得所需的行为。
使用以下内容,无论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
会删除文件,如果你没有放任何内容或空格。