使用MSBuild,一旦发生错误,除非ContinueOnError=true
,否则项目的执行将被停止。
有没有办法在不引发错误的情况下停止项目的执行?
我想有这种可能性,因为我有一组现有的msbuild项目文件,在某些情况下,我需要停止处理项目而不会引发错误,因为它是进程的正常退出点,而我不希望使用脚本的人认为某些事情是错误的。
我知道我可以设置一些属性并将所有剩余的任务置于此条件,但我想避免这种情况。
答案 0 :(得分:9)
正如您解释的那样,您希望在特殊情况下停止构建而不会引发错误,因为它是正常的退出点。为什么不创建一个目标,不做任何可以作为退出点的目标。在您的特殊情况下,您将调用此目标。
<target Name="BuildProcess">
<Message Text="Build starts"/>
...
<CallTarget Targets="Exit"
Condition="Special Condition"/>
<CallTarget Targets="Continue"
Condition="!(Special Condition)"/>
...
</target>
<target Name="Continue">
<Message Text="Build continue"/>
</target>
<target Name="Exit">
<!-- This target could be removed -->
<!-- Only used for logging here -->
<Message Text="Build ended because special condition occured"/>
</target>
答案 1 :(得分:2)
这样做的方法是创建另一个目标来包装您对调节感兴趣的目标。
因此,如果你有一个像这样的目标的场景:
<Target Name="MainTarget">
command - run under a certain condition
command - run under a certain condition
command - run under a certain condition
command - run under a certain condition
command - run under a certain condition
</Target>
关键是你要保存必须多次使用条件语句,对吗?
要解决此问题,您可以这样做:
<Target Name="MainWrapper" DependsOnTargets="EstablishCondition;MainTarget" />
<Target Name="EstablishCondition">
<SomeCustomTask Input="blah">
<Output PropertyName="TestProperty" TaskParameter="value" />
</SomeCustomTask>
</Target>
<Target Name="MainTarget" Condition="$(TestProperty)='true'">
command
command
command
command
command
</Target>
答案 2 :(得分:1)
最终为类似问题找到了一个优雅的解决方案。我只需要将“中断/中断MSBuild执行”改为“跳过下一个目标”。
<PropertyGroup>
<LastInfoFileName>LastInfo.xml</LastInfoFileName>
<NewInfoFileName>NewInfo.xml</NewInfoFileName>
</PropertyGroup>
<Target Name="CheckSomethingFirst" BeforeTargets="DoSomething">
<Message Condition="ConditionForContinue"
Text="Let's carry on with next target" />
<WriteLinesToFile Condition="ConditionForContinue"
File="$(NewInfoFileName)"
Lines="@(SomeText)"
Overwrite="true" />
<Message Condition="!ConditionForContinue"
Text="Let's discard next target" />
<Copy Condition="!ConditionForContinue"
SourceFiles="$(LastInfoFileName)"
DestinationFiles="$(NewInfoFileName)" />
</Target>
<Target Name="DoSomething" Inputs="$(NewInfoFileName)"
Outputs="$(LastInfoFileName)">
<Message Text="DoSomethingMore" />
<Copy SourceFiles="$(NewInfoFileName)"
DestinationFiles="$(LastInfoFileName)" />
</Target>
使用如下命令可以正常工作:
msbuild.exe Do.targets /t:DoSomething
目标 DoSomething 在 CheckSomethingFirst 目标执行后正确检查输入/输出。