使用 Msbuild 和 devenv 在项目解决方案下构建特定的 Visual Studio 项目

Posted

技术标签:

【中文标题】使用 Msbuild 和 devenv 在项目解决方案下构建特定的 Visual Studio 项目【英文标题】:Build specific Visual studio project under project solution using Msbuild and devenv 【发布时间】:2020-01-20 17:52:19 【问题描述】:

我有包含多个 .csproj 的 Visual Studio 项目解决方案。每个 .csproj 都有一些参考库。项目设置的方式是先构建参考库,然后构建 .csproj。当我在 Visual Studio IDE 中运行它时,它按预期工作。但是当我尝试使用 msbuild 执行时,我收到一条错误消息,指出目标不存在。浏览了许多与此问题相关的帖子,尝试了可能的事情。但没有建立。看起来我可能在做一些愚蠢的事情或在设置中遗漏了一些东西。

还尝试从命令行使用 devenv。使用此选项,我没有看到任何错误,但同时项目没有构建。执行命令后我没有看到任何消息。我正在使用 Visual Studio 2015

Here is my project structure
 Poject.sln
   ProjectA
   porjectB
   projectC
   Libraries
      libA
      libB

msbuild "project.sln" target:"D:\Projects\Source\Demo\ProjectA\ProjectA.csproj" /t:build 
 "/p:Configuration=Debug" "/p:platform=x86"

I see the below error
"D:\project.sln" (D:\Projects\Source\Demo\ProjectA\;build target) (1) ->
 D:\project.sln.metaproj : error MSB4057: The target "D:\Projects\Source\Demo\ProjectA" does not exist in the project. [D:\project.sln]

Here is the command used using devenv
devenv.exe "project.sln" /build Debug /project `"D:\Projects\source\Demo\Applications\ProjectA\ProjectA.csproj" /projectconfig Debug

 After executing the above its doesnt build and i dont see any error too.

【问题讨论】:

我发现了 devenv 命令行构建的问题。实际上代码正在构建,但它不会显示控制台输出。由于没有控制台输出,我觉得代码没有构建。使用 devenv 有一个命令行选项 /out 。使用它可以将输出捕获到文件中。 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" "D:\Projects\project.sln" /Rebuild "Debug|AnyCPU" /project "D:\Projects\projectA\projectA .csproj" /projectconfig 调试 /out "D:\Projects\Error.txt" 在命令行中使用 devenv 会停止执行,这可能会导致混淆。实际上代码是在后台构建的。所以最好使用带有相同命令行选项的 devenv.com。我们可以看到光标在闪烁,让我们感觉构建正在进行中。谁能告诉我如何在控制台上打印日志。是否有任何命令。 MSbuild 对我来说仍然是一个谜。希望有人指出我在使用 MSbuild 时的错误 要使用 msbuild,您不需要使用那种格式。 cdProjectA.csproj所在的文件夹,然后msbuild ProjectA.csproj /t:build /p:Configuration=Debug /p:platform=x86就够了。 【参考方案1】:

错误 MSB4057:目标“D:\Projects\Source\Demo\ProjectA”没有 存在于项目中。

该错误表明您在命令中的路径无效,并且 project.sln 无法识别该路径。所以你实际上遇到了一个与路径相关的问题。您应该将ProjectA 传递给目标参数,而不是ProjectA.csproj!更多详细信息请参阅 对于 MSBuild 中的提示 3。

对于 MSBuild:

1.如果您只是尝试构建 ProjectA 及其参考库。

导航(cd)到ProjectA.csproj所在的路径,然后使用命令msbuild ProjectA.csproj /t:build /p:Configuration=Debug /p:platform=x86

您也可以直接使用命令msbuild AbsolutePath\ProjectA.csproj /t:build /p:Configuration=Debug /p:platform=x86。不必使用" 来覆盖路径和参数。

(ProjectA.csproj 文件应该包含对这两个库项目的引用的定义,因此msbuild ProjectA.csproj 将首先构建这两个项目。您无需在命令中指定 xx.sln。)

2.如果您正在尝试构建整个解决方案(所有项目):

msbuild project.sln /t:build /p:Configuration=xxx /p:platform=xxx

运行上述命令时导航到解决方案文件夹,或将absolutepath\project.sln 与该命令一起使用。

3.当您想在解决方案中构建特定项目(多个)时:

检查How to: Build Specific Targets in Solutions By Using MSBuild.exe。由于您只是构建 ProjectA,因此您不需要使用这种格式。例如:只有当您需要同时构建ProjectA和ProjectB,而不是构建ProjectC时...您可以使用如下命令:

msbuild xxx.sln /t:NotInSlnfolder:Build;NewFolder\InSolutionFolder:Build  

使用这种格式时要注意路径。您的项目是否在解决方案文件夹中会极大地影响构建结果!而且,问题的直接原因是,此命令的 targets 参数需要一个 ProjectName 作为输入,而不是 ProjectName.csproj

对于 Devenv 命令:

1.我一直使用VS2017和VS2019,所以我不确定VS2015的devenv相关命令是否与VS2017或VS2019有很大区别。但是根据this VS2017 document的详细信息:

以 devenv 开头的命令由 devenv.com 实用程序处理,该实用程序通过标准系统流(例如 stdout 和 stderr)提供输出。 或者,以 devenv.exe 开头的命令可以使用相同的开关,但绕过 devenv.com 实用程序。直接使用 devenv.exe 会阻止输出出现在控制台上

我认为这就是为什么您在执行命令后看不到任何消息的原因。您应该使用devenv.com 命令在控制台中查看输出。 devenv.exe 会阻止输出出现在控制台上。

2.以下命令构建项目CSharpWinApp,使用MySolution中的Debug项目构建配置。

devenv "%USERPROFILE%\source\repos\MySolution.sln" /build Debug /project "CSharpWinApp\CSharpWinApp.csproj" /projectconfig Debug

更多关于devenv的参考请查看this document。

另外:

1.看起来你有一个奇怪的项目结构。我检查了您上面的错误消息,您的几个项目(xx.csproj)似乎不在解决方案(xx.sln)文件夹下。只是一个建议,VS2015的正常文件夹结构总是:

Solution folder
     xx.sln
     ProjectA folder
         ProjectA.csproj
     ProjectB folder
         ProjectB.csproj

2.对于大多数项目,使用msbuild 构建比使用devenv 构建更强大和方便。所以如果没有特殊原因,我推荐使用VS的构建引擎Msbuild

希望以上所有内容有助于解决您的问题和困惑。如果您的问题仍然存在,请告诉我:)

【讨论】:

兰斯,谢谢您的回复。其实我的项目和你解释的一样,我这边的类型错误。通过您提供的解决方案,至少它解决了目标不存在问题。但由于某种奇怪的原因,构建仍然失败。这是失败的,因为 msbuild 没有找到参考库。但同样的项目使用 IDE 构建得非常好 @chandankumar 对于msbuild doesn't find the reference libraries,请参阅edit,您可以通过edit 选项编辑您的问题(帖子),以分享有关您收到的新错误消息的更多详细信息。您如何引用这些库?使用项目依赖或项目参考?我对这个问题很感兴趣并愿意提供帮助,但更多细节可能会更好:) 如果我编辑我的帖子,我可能会丢失实际的问题声明。我如何确保第一个问题得到解决,然后遇到不同的问题。如果有办法跟踪在此过程中发生的整个问题陈述,请告诉我。 我的意思是添加更新的问题而不是删除原始问题。查看this post的格式,我们可以添加有问题的Update1、Update2...来跟踪整个过程中的问题。根据您上面的评论,我确信当 msbuild 无法识别 ProjectA 和库项目之间的依赖关系时会出现新问题,为此,我需要知道您的 projectA 如何在 csproj 中引用该库... 另外,请分享有关新问题的错误消息的详细信息...并且您的第一个问题是关于msbuild命令行的正确格式,这个新问题与此无关,新的问题可能与您在 xx.csproj 文件中的定义以及这些项目的路径有关。【参考方案2】:

文件“/Users/morel893/Desktop/env/lib/python3.7/site-packages/django/db/backends/utils.py”,第 84 行,在 _execute 返回 self.cursor.execute(sql, params) django.db.utils.ProgrammingError:关系“projects_project”不存在 第 1 行:...ct"."technology", "projects_project"."image" FROM "projects_...

【讨论】:

以上是关于使用 Msbuild 和 devenv 在项目解决方案下构建特定的 Visual Studio 项目的主要内容,如果未能解决你的问题,请参考以下文章

在 devenv 和 msbuild 中使用 CruiseControl.net 时输出二进制文件的任何差异

buildbot C++ 在 Windows 上构建:使用 devenv.com、vcbuild.exe 还是 MSBuild.exe?

使用devenv/MSBuild在命令行编译sln或csproj

由于缺少依赖项,MSBuild 清理操作失败

MSBuild 默默地跳过一个项目(在我的 sln 中的许多项目中)

是否可以从 csproj 文件中知道是使用 devenv 还是 msbuild 来运行它?