环顾四周后,使用内置功能似乎不可能实现这一点。从一个角度来看,这是有道理的:为什么项目必须知道它是由用户直接构建还是作为依赖项构建?可能 MSBuild 团队也遵循这个逻辑:MSBuild 中有相当多的扩展点,但不是为了这样做。
两个问题:构建依赖项目的代码只是使用MSBuild Task,并且没有提供传递属性的方法。但即使它确实如此,它也只能在从命令行构建时起作用,而不是在 VS 中,所以它不是一个“完整”的解决方案。以下是从构建依赖项目的 ResolveProjectReferences 中摘取的片段:
<!--
Build referenced projects when building from the command line.
-->
<MSBuild
Projects="@(_MSBuildProjectReferenceExistent)"
Targets="%(_MSBuildProjectReferenceExistent.Targets)"
BuildInParallel="$(BuildInParallel)"
Properties="%(_MSBuildProjectReferenceExistent.SetConfiguration); %(_MSBuildProjectReferenceExistent.SetPlatform)"
Condition="'%(_MSBuildProjectReferenceExistent.BuildReference)' == 'true' and '@(ProjectReferenceWithConfiguration)' != '' and '$(BuildingInsideVisualStudio)' != 'true' and '$(BuildProjectReferences)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != ''"
ContinueOnError="$(ContinueOnError)"
RemoveProperties="%(_MSBuildProjectReferenceExistent.GlobalPropertiesToRemove)">
...
</MSBuild>
Run Code Online (Sandbox Code Playgroud)
因此,无法在此处添加属性。尽管正如您所想,您可以通过设置 ProjectReference 的 GlobalPropertiesToRemove 来删除属性;取决于您的追求,这可能很有价值。
对于其余的,没有太多选择;您可以指定使用的目标: _MSBuildProjectReferenceExistent.Targets 设置为 $(ProjectReferenceBuildTargets) 这样您就可以覆盖调用的目标,但是您需要所有可能是依赖项目的项目来声明自定义目标(这将依次调用构建目标也是为了不破坏东西)。可行,但不太好,也不是问题的直接答案。其他解决方案也是如此:您可以通过复制它并在上面显示的代码片段中添加属性来覆盖整个 ResolveProjectReferences 目标(对于可以具有依赖项目的任何项目)。
但正如所说的(如上面代码片段中的条件所示):在 VS 中构建时,这些可能的解决方案都不适用。我不知道具体为什么或如何工作,但如果 A 依赖于 B 并且你在 VS 中构建 A 并且它发现 B 已过时,它只会在构建 A 之前为其启动构建,我不知道与之交互的任何标准方式。
归档时间: |
|
查看次数: |
1042 次 |
最近记录: |