何时需要向 MSBuild 传递解决方案文件?

When do I need to pass MSBuild a solution file?

从命令行,我什么时候直接在项目上调用 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"

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 构建项目,这些依赖项信息将被忽略。

例如,我创建了一个包含三个项目的解决方案,TestSampleTestSampleBTestSampleC。使用解决方案将 TestSampleBTestSampleC 引用添加到 TestSample(右键单击您的 解决方案 ->属性->通用属性->项目依赖项):

当我们使用 (b) 命令行构建项目 TestSample 时, 项目 TestSample已建成,TestSampleBTestSampleC忽略

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?

如果构建项目与解决方案中的其他项目没有相互依赖关系,则构建此项目将比整个解决方案更快。

希望对您有所帮助。

到目前为止,我可以确定这些问题:

  • 很明显,如果您有其他基于 sln 的依赖项,这些将被忽略。
    • 在当今时代,您确实应该使用 project2project 依赖项,但我认为在某些情况下坚持使用解决方案依赖有一些半正当的理由。
  • 宏观价值。以 $(SolutionFileName) 开头以及以解决方案开头的所有其他内容。如果您的项目或其依赖项使用以下任何一种:结果可能会略有不同。
  • 平台。 天哪。你看,它们 解决方案 平台的工作方式,它们基本上只是一个命名容器,用于将项目平台选择组合在一起。

    这意味着,尤其是。对于 C++,调用 sln 文件时很可能需要指定不同的平台。例如,对于解决方案,您将构建 'Mixed Platforms' 或 'Any CPU',但对于 项目 ,您实际上需要指定 x64Win32.

    所以需要通过的平台可能会有所不同。