使用msbuild指定解决方案的项目文件


116

我想要像使用devenv.com一样使用msbuild构建解决方案的特定项目的命令行。在devenv.com中,我们可以使用以下命令行指定解决方案的项目

devenv.com /Build Release|x86 test.sln /project "testproject"

使用上面的命令行,我可以使用devenv.com在test.sln中构建测试项目。对于同一解决方案,msbuild的命令行是什么。

谢谢


有什么原因不只是将testproject本身传递给msbuild?
马克·史密斯

2
由于我无法再编辑我的评论。我的意思是直接引用项目而不是解决方案。“ msbuild testproject / p:Configuration =发布/ p:Platform = x86”
Mark Smith

在不同的时间,我必须构建不同的project.using devenv.com,只需指定该解决方案的项目即可轻松完成
tjdoubts

如果这是唯一的问题,则应该可以使用msbuild在正确的时间构建所需的项目。您已经在解决方案的不同时间执行了不同的命令,那么为什么不只在适当的时间使用不同的msbuild命令引用项目呢?如果您的项目设置正确,则应在不使用sln文件的情况下找出所有引用。
马克·史密斯

Answers:


201
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


98
重要说明:如果您的项目有一个“。” 名称中,用/ t指定时需要用“ _”替换
Watusimoto 2015年

4
@easton对于构建多个项目,synthax是我的msbuild重复/t每个要构建项目的参数:msbuild test.sln /t:project /t:project2
Philippe

46
另外,如果您使用的是解决方案文件夹,则必须在项目名称前添加文件夹名称和斜杠。就像上面提到的@Watusimoto一样,如果名称中包含句点(。),则必须用下划线(_)替换。我最终得到了这样的东西:/t:SlnFolder\My_Project_name
特拉维斯公园公园

28
@TravisParks:也可能是值得一提的是“解决方案文件夹”并没有引用一个文件系统文件夹,而是在解决方案资源管理器视图中的文件夹。
joshbodily

4
我还必须在文件夹名称中将'('和')'替换为'_'(GYP生成的项目)。我想这是所有特殊字符都被下划线替换了。
Maxime Viargues

15

MSBuild实际上是通过使用项目而不是通过解决方案来工作的。该解决方案仅用于在内部将其解析为MSBuild中的临时项目文件。通过执行以下命令,您应该能够直接通过MSBuild直接构建感兴趣的项目。

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

我知道有一个主要问题,您可能会遇到直接使用项目而不是解决方案的问题:如果您使用解决方案来表达项目之间的依赖关系,而不是向项目添加引用并让构建系统自动计算出依赖关系。

如果要使用sln文件强制执行构建顺序,建议将这些依赖项直接处理到proj文件中,并将其从sln中删除。这将允许您直接从MSBuild调用任何proj文件,并且所有项目都将独立构建,而无需进行任何其他工作。您确实应该将sln文件视为一组项目,以使在Visual Studio中的工作更加容易,而不是将其作为构建输入。


4
请指出如何从proj文件强制执行构建顺序。谢谢。
ProgramCpp 2015年

4
这是直接使用项目名称的另一个问题。例如,您的解决方案中有5个项目。有些项目具有DebugPro配置,而其他项目则没有。如果您使用所有项目都包含文件的配置来构建项目,但只有解决方案文件知道选择了解决方案配置DebugPro时每个项目要使用的项目配置。
Alex

@ProgramCpp当您将引用从一个项目添加到另一个项目时,它会自动确定所引用的项目需要首先构建。
jpaugh

这种方法的另一个缺点是项目中的相对路径是相对于解决方案文件来解析的。一旦您直接构建项目,相对路径就会改变。输出可能在其他地方,并且单元测试可能会查找错误的目录。
Tomas Kubes,

如果在项目配置中使用解决方案变量,例如$(SolutionDir)
Alex Che,

8

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

将以下内容添加到构建脚本并运行一次。这将生成msbuild实际使用的确切目标和其他信息。

例如:如果您.在项目名称或文件夹中包含msbuild,它将_代替.

set MSBuildEmitSolution=1

获取信息后,请使用所需的详细信息更新构建脚本。


6
`如果您有'。msbuild将在项目名称或文件夹中使用“ _”代替“。”
。–

2

为此,您需要知道项目的目标名称是什么,而不必知道项目名称。

找出这种情况的一种方法是,在将特殊环境变量设置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

2
这就是我所需要的。提示是否不想运行此文件:目标是从当前路径到项目文件的文件夹结构,减去项目文件扩展名(.csproj在我的情况下)。我<3 SO!
不退款

1

只是为了添加其他信息,默认情况下在项目文件夹中执行msbuild将生成项目文件,因为该文件只有该位置。

>msbuild

以这种方式使用msbuild有许多变体。您可以直接指定proj文件。

>msbuild helloworld.csproj -t:Build.

查看msbuild文档以了解用法,proj文件要求以及构建项目而不是解决方案的好处。

MS MSBuild文档

如上面的马克·史密斯所述,构建这种方式有很多好处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.