从命令行,我什么时候直接在项目上调用 MSBuild,什么时候在项目的 sln
文件上调用 MSBuild,传递 /t:Build/t:ProjectName
?
示例:我有一个包含多个项目(A、B、C、...)的简单解决方案。通过打开并使用解决方案,通过 VS GUI 完成开发。
现在,在一个特定的自动化案例中,我只想从命令行构建项目 B:
我应该怎么称呼?:
(a) MSBuild "my.sln""/t:Build""/t:ProjB""/p:Configuration=Release""/p:Platform=Any CPU"
(b) MSBuild "ProjB.vcxproj""/t:Build""/p:Configuration=Release""/p:Platform=Any CPU"
- 结果会有什么不同吗?
- 会不会
sln
文件中有任何其他设置被这种方式遗漏了? (我当然没有在我们的 VS2015sln
文件中看到任何其他信息。) - 如果解决方案很大,但 ProjB 与解决方案中的其他项目几乎没有相互依赖关系,一般来说,一个选项会更快吗?
最佳答案
What should I call? Will there be any difference in the outcome? Could there be any additional setting in the sln file that gets missed this way?
深入如何表达项目之间的依赖关系,使用解决方案表达项目之间的依赖关系或添加对项目的引用?
如果您使用解决方案来表达项目之间的依赖关系,您应该调用命令行(a)。如果调用命令行 (b),依赖项目将被忽略。因为解决方案文件用于在内部将其解析为 MSBuild 中的临时项目文件,所以如果您通过 ProjB.vcxproj
构建项目,这些依赖项信息将被忽略。
例如,我创建了一个包含三个项目的解决方案,TestSample
、TestSampleB
、TestSampleC
。使用该解决方案将 TestSampleB
、TestSampleC
引用添加到 TestSample
(右键单击您的解决方案->Properties->通用属性->项目依赖项):
当我们使用(b)命令行构建项目TestSample
时,仅构建了项目TestSample
, TestSampleB
, TestSampleC
被忽略。
MSBuild "TestSample\TestSample.vcxproj"
当我们调用(a)命令行时,所有的依赖项目都被构建了:
MSBuild "TestSample.sln" /t:"TestSample"
如果将引用添加到项目中(右键单击项目->添加引用),则可以同时调用两个命令行。将构建所有依赖项项目。
因此,如果您使用 sln 文件表达项目之间的依赖关系,我建议将这些依赖关系直接处理到 proj 文件中并将它们从 sln 中删除。这将允许您直接从 MSBuild 调用任何项目文件,项目将全部独立构建,无需任何额外工作。
If the solution is large, but ProjB has little interdependencies with other projects in the solution, will one option be faster in general?
如果构建项目与解决方案中的其他项目没有相互依赖关系,则构建此项目将比整个解决方案更快。
希望这对您有所帮助。
关于visual-studio - 何时需要向 MSBuild 传递解决方案文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827495/