从命令行在解决方案中仅构建一个项目

mmu*_*lva 41 c# msbuild visual-studio

我有一个解决方案,里面有很多解决方案文件夹,里面有很多c#项目.

如何从命令行仅构建/重建其中一个项目?

我想有一些方法可以使用msbuild但我对msbuild一无所知.

谢谢!

C J*_*son 98

给定一个包含项目的解决方案文件,并且您希望构建/重建一个项目.

MSDN上的这个网页列出了你要做的事情:

http://msdn.microsoft.com/en-us/library/ms171486.aspx

所以给出了一个带有项目的解决方案文件mysolution.sln:

  • foo.vcxproj
  • bar.vcxproj
  • baz.vcxproj

它们都是从底部到顶部依次相互依赖的地方.所以这baz是最独立的,bar取决于bazfoo取决于bar.

如果你想构建foo,那么你可以:

MSBuild mysolution.sln /target:foo
Run Code Online (Sandbox Code Playgroud)

这里的其他答案没有考虑依赖关系.当然msbuild.exe将构建一个项目文件(即foo.vcxproj),但如果bar和baz尚未构建,它将失败.为了构建多个项目并首先构建独立项目,您必须传入解决方案文件(毕竟OP确实提到这是解决方案文件的一部分).然后传入项目名称和冒号分隔的目标.

MSBuild mysolution.sln /target:foo:Rebuild
Run Code Online (Sandbox Code Playgroud)

这里的假设很大.我假设项目名称$(ProjectName)与文件名匹配.

编辑(来自评论):如果项目名称中恰好有点(.),则需要用下划线(_)替换它们.

  • 如果您在项目名称中碰巧有点(.),则需要用下划线(_)替换它们.再一次,MS文档完全缺乏. (29认同)
  • 此外,如果项目位于解决方案文件夹中,则需要在目标名称中指定它,例如`/ target:myfolder\foo` (16认同)
  • 另一个注意事项使这成为一个更好的答案,如果构建具有利用变量的前/后事件(例如 $(SolutionDir)),则此方法有效。其他方法不提供所有这些变量。 (3认同)

Joe*_*nos 24

您可以简单地调用msbuild并传递您要构建的.csproj/.vbproj项目文件,它只会执行该文件.

所以类似于:

cd \MySolution
msbuild .\Project1\Project1.csproj
Run Code Online (Sandbox Code Playgroud)

  • 这并未考虑解决方案文件可能构建的任何未构建的依赖项. (4认同)
  • msbuild就在您的.NET框架目录中(可能是C:\ WINDOWS\Microsoft.NET\Framework\v4.0.30319).因此,您可以将此目录添加到全局PATH(并删除其他框架版本),或者更好的方法是在批处理文件中调用它时使用完整的文件路径,例如`C:\ WINDOWS\Microsoft.NET\Framework\v4.0.30319\msbuild.exe myProject.csproj` (3认同)
  • 我建议你通过Jenkins等持续集成服务器进行构建.这将使您能够更好地组织构建,并更深入地了解它们是否成功构建. (3认同)
  • 我试过并得到:错误MSB4019:找不到导入的项目"C:\ Windows\Microsoft.NET\Framework\v3.5\Workflow.Targets".确认<Import>声明中的路径是正确的,并且该文件存在于磁盘上. (2认同)

Ber*_*ard 5

您可以查阅参考资料以了解有关从命令行使用 MSBuild 的更多信息。这是您需要的示例:

MSBuild.exe MyProject.proj /t:rebuild
Run Code Online (Sandbox Code Playgroud)

  • 这只是故事的一半。OP 在解决方案文件中表示了一个项目。解决方案文件可能会列出需要首先构建的额外依赖项。如果您从头开始构建并且尚不存在任何依赖项,则构建可能会失败。 (2认同)