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

问题描述 投票:93回答:5

我希望命令行使用msbuild构建解决方案的特定项目,就像我们使用devenv.com.In devenv.com,我们可以使用以下命令行指定解决方案的项目

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

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

谢谢

build tfs msbuild release devenv
5个回答
164
投票
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所述:

如果项目名称包含任何字符%$@;.()',请用指定目标名称中的_替换它们。

您还可以一次构建多个项目:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

要重建或清理,请将/t:project更改为/t:project:clean/t:project:rebuild


14
投票

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

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

我知道有一个主要问题是你可以直接使用项目而不是解决方案:如果你使用解决方案表达项目之间的依赖关系,而不是添加对项目的引用,让构建系统自动解决依赖关系。

如果您使用sln文件强制执行构建顺序,我建议将这些依赖项直接用于proj文件并从sln中删除它们。这将允许您直接从MSBuild调用任何proj文件,并且项目将独立构建而无需任何额外的工作。您真的应该将sln文件视为一组项目,以使Visual Studio中的工作更容易,而不是作为构建输入。


6
投票

作为未来寻求者的信息发布

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

例如:如果您在项目名称或文件夹中有.,则msbuild会指望_代替.

set MSBuildEmitSolution=1

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


1
投票

只是为了添加附加信息,在项目文件夹中执行msbuild将默认构建项目文件,因为它是唯一的文件。

>msbuild

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

>msbuild helloworld.csproj -t:Build.

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

MS MSBuild Documentation

如上面的mark-smith所提到的,建立这种方式是有好处的。


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
© www.soinside.com 2019 - 2024. All rights reserved.