我想要像使用devenv.com一样使用msbuild构建解决方案的特定项目的命令行。在devenv.com中,我们可以使用以下命令行指定解决方案的项目
devenv.com /Build Release|x86 test.sln /project "testproject"
使用上面的命令行,我可以使用devenv.com在test.sln中构建测试项目。对于同一解决方案,msbuild的命令行是什么。
谢谢
我想要像使用devenv.com一样使用msbuild构建解决方案的特定项目的命令行。在devenv.com中,我们可以使用以下命令行指定解决方案的项目
devenv.com /Build Release|x86 test.sln /project "testproject"
使用上面的命令行,我可以使用devenv.com在test.sln中构建测试项目。对于同一解决方案,msbuild的命令行是什么。
谢谢
Answers:
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
请注意,分配给/t
解决方案中的项目名称是项目名称,它可以与项目文件名称不同。
另外,如如何:使用MSBuild.exe在解决方案中构建特定目标中所述:
如果项目名称包含任何字符
%
,$
,@
,;
,.
,(
,)
,或者'
,有取代他们_
在指定的目标名称。
您还可以一次构建多个项目:
msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
要重建或清洁,请更改/t:project
为/t:project:clean
或/t:project:rebuild
/t
每个要构建项目的参数:msbuild test.sln /t:project /t:project2
/t:SlnFolder\My_Project_name
。
MSBuild实际上是通过使用项目而不是通过解决方案来工作的。该解决方案仅用于在内部将其解析为MSBuild中的临时项目文件。通过执行以下命令,您应该能够直接通过MSBuild直接构建感兴趣的项目。
"msbuild testproject /p:Configuration=Release /p:Platform=x86"
我知道有一个主要问题,您可能会遇到直接使用项目而不是解决方案的问题:如果您使用解决方案来表达项目之间的依赖关系,而不是向项目添加引用并让构建系统自动计算出依赖关系。
如果要使用sln文件强制执行构建顺序,建议将这些依赖项直接处理到proj文件中,并将其从sln中删除。这将允许您直接从MSBuild调用任何proj文件,并且所有项目都将独立构建,而无需进行任何其他工作。您确实应该将sln文件视为一组项目,以使在Visual Studio中的工作更加容易,而不是将其作为构建输入。
为此,您需要知道项目的目标名称是什么,而不必知道项目名称。
找出这种情况的一种方法是,在将特殊环境变量设置MSBuildEmitSolution
为的值之后,对带有预期参数的SLN使用MSBuild 1
。
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
.csproj
在我的情况下)。我<3 SO!
只是为了添加其他信息,默认情况下在项目文件夹中执行msbuild将生成项目文件,因为该文件只有该位置。
>msbuild
以这种方式使用msbuild有许多变体。您可以直接指定proj文件。
>msbuild helloworld.csproj -t:Build.
查看msbuild文档以了解用法,proj文件要求以及构建项目而不是解决方案的好处。
如上面的马克·史密斯所述,构建这种方式有很多好处。