使用 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,您不需要使用那种格式。cd
到ProjectA.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