我希望命令行使用msbuild构建解决方案的特定项目,就像我们使用devenv.com一样。在devenv.com中,我们可以使用以下命令行指定解决方案的项目
devenv.com /Build Release|x86 test.sln /project "testproject"
使用上面的命令行我可以使用devenv.com在test.sln中构建testproject。对于同一解决方案,msbuild的命令行是什么。
由于
答案 0 :(得分:162)
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
请注意,分配给/t
的是项目名称,它可能与项目文件名不同。
另外,如How to: Build specific targets in solutions by using MSBuild.exe中所述:
如果项目名称包含任何字符
%
,$
,@
,;
,.
,(
,{{ 1}}或)
,用指定目标名称中的'
替换它们。
您还可以一次构建多个项目:
_
要重建或清理,请将msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
更改为/t:project
或/t:project:clean
答案 1 :(得分:14)
MSBuild实际上是通过使用项目而不是解决方案来实现的。该解决方案仅用于在内部将其解析为MSBuild中的临时项目文件。您应该能够通过执行以下命令直接通过MSBuild构建感兴趣的项目。
"msbuild testproject /p:Configuration=Release /p:Platform=x86"
我知道有一个主要问题是您可以直接使用项目而不是解决方案:如果您使用解决方案来表达项目之间的依赖关系,而不是添加对项目的引用并让构建系统运行自动依赖。
如果使用sln文件强制执行构建顺序,我建议将这些依赖项直接用于proj文件并从sln中删除它们。这将允许您直接从MSBuild调用任何proj文件,并且项目将独立构建而无需任何额外的工作。您真的应该将sln文件视为一组项目,以使Visual Studio中的工作更容易,而不是作为构建输入。
答案 2 :(得分:6)
向未来的求职者发布信息
将以下内容添加到构建脚本并运行一次。这将生成msbuild实际使用的确切目标和其他信息。
例如:如果项目名称或文件夹中有.
,则msbuild将_
代替.
。
set MSBuildEmitSolution=1
获取信息后,使用所需的详细信息更新构建脚本。
答案 3 :(得分:1)
只需添加其他信息,由于默认情况下在项目文件夹中执行msbuild,因此默认情况下会生成项目文件。
room
以这种方式使用msbuild有许多变体。您可以直接指定proj文件。
>msbuild
查看msbuild文档的用法,proj文件要求以及构建项目而不是解决方案的好处。
如上面的马克·史密斯所述,构建这种方式有很多好处。
答案 4 :(得分:0)
为此,您需要知道项目的 目标名称 是什么,不一定是项目名称。
一种发现方法是在将名为MSBuildEmitSolution
的特殊环境变量设置为1
的值之后,对带有预期参数的SLN使用MSBuild。
set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64
由于嵌套目录中目标的名称非常具体,我最近不得不这样做。因此,从我生成的文件my_stuff.sln.metaproj
中找到了这一行:
<Target Name="Utils\Firewall\FirewallUtils:Rebuild">
这意味着最终使用的命令行是
msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64