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

tjd*_*bts 103 msbuild tfs release build devenv

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

devenv.com /Build Release|x86 test.sln /project "testproject"
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Eas*_* L. 181

msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
Run Code Online (Sandbox Code Playgroud)

请注意,分配给的/t是解决方案中的项目名称,它可以与项目文件名不同.
此外,如果它包含一个点,请用下划线替换它.

来自@Watusimoto的重要评论:
如果你的项目名称中有一个%(点),$用/ t指定它时用(下划线)替换它

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

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false
Run Code Online (Sandbox Code Playgroud)

要重建或清理,请更改@;.

  • 一个重要的注意事项:如果您的项目有'.' 在名称中,当使用/ t指定时,您需要用'_'替换它 (92认同)
  • 此外,如果您使用的是解决方案文件夹,则必须在项目名称前加上文件夹名称和斜杠.与上面提到的@Watusimoto一样,如果名称中有句点(.),则必须用下划线(_)替换它们.我最终得到了这样的东西:`/ t:SlnFolder\My_Project_name`. (40认同)
  • @TravisParks:还可能值得一提的是,"解决方案文件夹"确实_not_引用文件系统文件夹,而不是解决方案资源管理器视图中的文件夹. (21认同)
  • 我还必须在文件夹名称(GYP生成的项目)中用'_'替换'('和')'.我猜这是所有特殊字符都用下划线替换. (4认同)
  • @easton为了构建多个项目,synthax用于我的msbuild为每个要构建的项目重复`/ t`参数:`msbuild test.sln/t:project/t:project2` (3认同)

Mar*_*ith 14

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

"msbuild testproject /p:Configuration=Release /p:Platform=x86"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请指出如何从proj文件强制执行构建顺序.谢谢. (4认同)
  • 这是直接使用项目名称的另一个问题.例如,您的解决方案中有5个项目.有些项目有DebugPro配置,其他项目没有.如果您使用配置构建项目,所有项目都包含文件,但只有解决方案文件知道在选择解决方案配置DebugPro时每个项目使用哪个项目配置. (4认同)

小智 8

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

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

例如:如果你有.项目名称或文件夹,msbuild将_代替..

set MSBuildEmitSolution=1
Run Code Online (Sandbox Code Playgroud)

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

  • "如果你有'.' 在项目名称或文件夹中,msbuild将期望'_'代替'.'.` (5认同)

kay*_*eck 8

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

找到这个问题的一种方法是,在设置一个名为 的MSBuildEmitSolution值的特殊环境变量后,使用 MSBuild 与您的 SLN 结合使用预期参数1

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64
Run Code Online (Sandbox Code Playgroud)

由于嵌套目录中目标的名称非常具体,我最近不得不执行此操作。所以从我生成的文件中,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
Run Code Online (Sandbox Code Playgroud)

  • 这就是我所需要的。如果您不想运行此命令,请提示:您的目标是从当前路径到项目文件的文件夹结构,减去项目文件扩展名(在我的例子中为“.csproj”)。我&lt;3所以! (2认同)