从命令行仅在解决方案中构建一个项目

Posted

技术标签:

【中文标题】从命令行仅在解决方案中构建一个项目【英文标题】:Build only one project in a solution from command line 【发布时间】:2011-07-30 07:23:36 【问题描述】:

我有一个包含大量解决方案文件夹的解决方案,其中包含大量 c# 项目。

如何从命令行仅构建/重建其中一个项目?

我想有一些方法可以使用 msbuild,但我对 msbuild 一无所知。

谢谢!

【问题讨论】:

类似“msbuild TargetProj.csproj /t:rebuild” 警告:接受的答案和上面的评论是一个危险的答案。它不考虑解决方案依赖性或任何依赖于正在加载的解决方案的目标,即使目标是仅构建一个项目。仅当您知道可以为真正的原子项目安全地隔离构建流程时才这样做。 【参考方案1】:

给定一个包含项目的解决方案文件,并且您想要构建/重建一个项目。

MSDN 上的这个网页准确地列出了你必须做的事情:

http://msdn.microsoft.com/en-us/library/ms171486.aspx

所以给定一个带有项目的解决方案文件 mysolution.sln:

foo.vcxproj bar.vcxproj baz.vcxproj

它们都以自下而上的顺序相互依赖。所以baz 是最独立的,bar 依赖于bazfoo 依赖于bar

如果你想构建 foo,那么你就这样做:

MSBuild mysolution.sln /target:foo

这里的其他答案没有考虑依赖关系。当然 msbuild.exe 将构建单个项目文件(即 foo.vcxproj),但如果 bar 和 baz 尚未构建,它将失败。为了构建多个项目并首先构建独立项目,您必须传入解决方案文件(毕竟 OP 确实提到这是解决方案文件的一部分)。然后传入项目名称和一个以冒号分隔的目标。

MSBuild mysolution.sln /target:foo:Rebuild

这里有很大的假设。我假设项目名称 $(ProjectName) 与文件名匹配。

编辑(来自comment):如果您碰巧在项目名称中包含点 (.),则需要将它们替换为下划线 (_)。

【讨论】:

+1 作为答案,它似乎运作良好。但是,我只是尝试了这种情况,一个依赖项依赖于另一个依赖项,并且仅针对我关心的项目运行 msbuild 仍然可以正常工作。显然 msbuild 足够聪明,可以按顺序构建依赖项。因此,据我所知,这两种解决方案都同样有效。 另外,如果项目在解决方案文件夹中,则需要在目标名称中指定,如/target:myfolder\foo 如果项目名称中碰巧有点 (.),则需要将它们替换为下划线 (_)。再一次,完全缺乏 MS 文档。 如果您不确定目标名称可能是什么,下面的 stackexchange 帖子将帮助您:***.com/a/484528 如果构建具有使用变量的前/后事件(例如 $(SolutionDir)),则此方法有效。其他方法不提供所有这些变量。【参考方案2】:

您可以简单地调用msbuild 并将您要构建的 .csproj/.vbproj 项目文件传递给它,它只会做那个。

比如:

cd \MySolution
msbuild .\Project1\Project1.csproj

【讨论】:

我试过了,得到:错误 MSB4019:找不到导入的项目“C:\Windows\Microsoft.NET\Framework\v3.5\Workflow.Targets”。确认 声明中的路径正确,并且该文件存在于磁盘上。 您使用的是正确的 msbuild 版本吗?确保打开 Visual Studio 2010 命令提示符,这样它就不会使用旧的 .NET Framework 构建器。如果这不是问题,那么工作流安装本身可能存在问题,我不知道从那里去哪里。 msbuild 就在您的 .NET 框架目录中(可能是 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319)。因此,您可以将此目录添加到全局 PATH(并删除其他框架版本),或者更好的是在批处理文件中调用它时只使用完整的文件路径,例如 C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\msbuild.exe myProject.csproj 我建议您通过 Jenkins 等持续集成服务器进行构建。这将使您能够更好地组织构建,并更深入地了解它们是否构建成功。 这没有考虑解决方案文件可能构建的任何未构建的依赖项。【参考方案3】:

您可以参考this 参考以了解有关从命令行使用 MSBuild 的更多信息。这是您需要的示例:

MSBuild.exe MyProject.proj /t:rebuild

【讨论】:

我试过了,得到:错误 MSB4019:找不到导入的项目“C:\Windows\Microsoft.NET\Framework\v3.5\Workflow.Targets”。确认 声明中的路径正确,并且该文件存在于磁盘上 这只是故事的一半。 OP 在解决方案文件中表示一个项目。解决方案文件可能会列出需要首先构建的额外依赖项。如果您从头开始构建并且尚不存在任何依赖项,则构建可能会失败。【参考方案4】:

作为信息发布给未来的求职者

设置 MSBuildEmitSolution=1

https://***.com/a/40372894/826862

【讨论】:

以上是关于从命令行仅在解决方案中构建一个项目的主要内容,如果未能解决你的问题,请参考以下文章

Swift - tableView中的可移动行仅在一个部分内,而不是在一个部分之间

仅在发布时发生构建错误

在没有 Xcode 的情况下创建存档

从命令行构建多个 CDT C++ 项目

如何在针对特定 Gradle 构建风格的同时从命令行运行单个单元测试方法

在命令行中将构建工具从 VS2010 更改为 VS2015