从命令行仅在解决方案中构建一个项目
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
依赖于baz
,foo
依赖于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”。确认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”。确认作为信息发布给未来的求职者
设置 MSBuildEmitSolution=1
https://***.com/a/40372894/826862
【讨论】:
以上是关于从命令行仅在解决方案中构建一个项目的主要内容,如果未能解决你的问题,请参考以下文章
Swift - tableView中的可移动行仅在一个部分内,而不是在一个部分之间