MSBuild Target元素Inputs属性:输入文件不存在时的构建状态问询
关于MSBuild Target Inputs文件不存在时的增量构建判定
答案是肯定的:当Inputs中指定的任意文件实际不存在时,MSBuild会直接判定该Target为过时(out-of-date),并执行这个Target里的所有任务。
为什么会这样?MSBuild的增量构建逻辑核心是对比输入输出文件的时间戳,但前提是所有输入文件都必须存在。如果有一个输入文件找不到,MSBuild就没法完成完整的有效性校验——毕竟连基础的输入都缺失了,它没法确认当前的输出是不是基于完整输入生成的。这种情况下,它会默认认为Target需要重新执行,确保输出结果是正确的。
举个实际的配置例子更容易理解:
<Target Name="CompileMyCode" Inputs="src\core.cs;src\utils.cs" Outputs="bin\MyApp.exe"> <Csc Sources="@(Inputs)" OutputAssembly="$(Outputs)" /> </Target>
如果上面配置里的src\utils.cs不存在,那么每次触发构建时,这个CompileMyCode Target都会被执行,而不会被增量构建逻辑跳过。
如果你的场景里某些输入文件是可选的(比如可能存在也可能不存在),可以通过条件判断来过滤掉不存在的文件,避免影响增量构建的判定。比如这样调整:
<Target Name="CompileMyCode" Inputs="@(ValidSources)" Outputs="bin\MyApp.exe"> <ItemGroup> <ValidSources Include="src\core.cs" /> <!-- 只加入存在的文件 --> <ValidSources Include="src\utils.cs" Condition="Exists('src\utils.cs')" /> </ItemGroup> <Csc Sources="@(ValidSources)" OutputAssembly="$(Outputs)" /> </Target>
这样只有实际存在的文件会被纳入Inputs的校验列表,不存在的文件就不会触发Target被强制执行了。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

