我希望使用命令行来使用 msbuild 构建解决方案的特定项目,就像我们使用 devenv.com 一样。我们可以使用以下命令行来指定解决方案的项目
devenv.com /Build Release|x86 test.sln /project "testproject"
使用上面的命令行,我可以使用 devenv.com 在 test.sln 中构建 testproject。同一个解决方案的 msbuild 命令行是什么。
谢谢
MSBuild 实际上是通过使用项目而不是解决方案来工作的。该解决方案仅用于将其解析为 MSBuild 内部的临时项目文件。您应该能够通过执行以下命令直接通过 MSBuild 生成感兴趣的项目。
"msbuild testproject /p:Configuration=Release /p:Platform=x86"
我知道你可能会直接使用项目而不是解决方案遇到一个主要问题: 如果你使用解决方案来表达项目之间的依赖关系,而不是添加对项目的引用并让构建系统自动解决依赖关系。
如果您使用 sln 文件强制执行构建顺序,我建议将这些依赖项直接工作到 proj 文件中,并从 sln 中删除它们。这将允许您直接从 MSBuild 调用任何项目文件,并且所有项目都将独立构建,而不需要进行任何额外的工作。您确实应该将 sln 文件视为一组项目,以使在 VisualStudio 中的工作更加容易,而不是将其视为生成输入。
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
请注意,分配给 /t的是解决方案中的项目名称,它可以不同于项目文件名。
/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:project
/t:project:clean
/t:project:rebuild
作为信息发布给未来的求职者
将以下内容添加到构建脚本并运行一次。这将生成 msbuild 实际使用的确切目标和其他信息。
例句: 如果你有 .在项目名称或文件夹 msbuild 将期望取代 .的 _。
set MSBuildEmitSolution=1
获取信息后,用所需的详细信息更新构建脚本。
只是为了添加额外的信息,在项目文件夹中执行 msbuild 默认情况下将生成项目文件,因为那里只有一个 msbuild。
>msbuild
以这种方式使用 msbuild 有很多变体,您可以直接指定 proj 文件。
>msbuild helloworld.csproj -t:Build.
检查 msbuild 文档的使用情况、 proj 文件需求,以及构建项目而不是解决方案的好处。
MSBuild 文档
正如上面 Mark-smith 所提到的,这种方式有很多好处。
为此,您需要知道项目的 目标名称是什么,而不一定是项目名称。
找出这个问题的一个方法是,在设置一个特殊的环境变量 MSBuildEmitSolution为 1之后,使用带有预期参数的 MSBuild 对 SLN 进行测试。
MSBuildEmitSolution
1
set MSBuildEmitSolution=1 msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64
我最近不得不这样做,因为嵌套目录中的目标有一个非常特定的名称。因此,从我生成的 my_stuff.sln.metaproj文件中,我发现了这一行:
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