MSBuild 因两个包而失败

Posted

技术标签:

【中文标题】MSBuild 因两个包而失败【英文标题】:MSBuild fails with two packages 【发布时间】:2013-01-09 00:28:35 【问题描述】:

好的,这是一个很棒的错误。我有一个在 2012 TFS 服务器上执行 MSBuild 的 2012 解决方案。传递给构建过程模板中“MSBuild Arguments”字段的参数如下:

/p:DeployOnBuild=true /p:PublishProfile=ProfileForProjectA /p:PublishProfile=ProfileForProjectB /p:VisualStudioVersion=11.0

我从 TFS 得到的错误是....

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\Web\Microsoft.Web.Publishing.targets (4435):PublishProfile 的值设置为 'ProfileForProjectA',预计会在 ' C:\Builds\1\Solution\Solution\Sources\Solution\ProjectB\Properties\PublishProfiles\ProfileForProjectA.pubxml' 但找不到。

换句话说,构建服务器似乎希望每个发布配置文件 (*.pubxml) 位于每个 PublishProfiles 文件夹中。两个项目的发布方法都是“文件系统”。

为我解决这个问题的唯一方法是将 ProfileForProjectA 添加到 ProjectB 的 PublishProfiles 文件夹中,反之亦然,但这似乎不是一个非常优雅的解决方案。任何人都可以重现这种行为吗?有没有人有更优雅的修复?我错过了什么吗?

提前致谢。

【问题讨论】:

【参考方案1】:

当您通过命令行传递属性时,它们是全局 MSBuild 属性。因此,它们被传递给 .sln 文件中的每个项目。 Web 项目是唯一响应这些特定属性的项目。

在您的场景中,如果您有两个项目要在 .sln 文件中构建+发布,则需要在每个 Web 项目中创建一个同名的配置文件,例如“MyProfile”。它们不需要包含相同的信息,它们都可以有自己独特的设置集。他们只需要分享一个名字。

然后当你构建时。

msbuild.exe mysolution.sln /p:DeployOnBuild=true /p:PublishProfile=MyProfile /p:VisualStudioVersion=11.0

在构建每个 Web 项目时,将调用该项目中 MyProfile 的发布过程。

如果您想为 PublishProfile 指定不同的值,则需要创建一个 MSBuild 脚本而不是构建 .sln 文件。有几种不同的方法可以解决它,但它们都涉及到一些 MSBuild。

免责声明

请勿将这种技术用于实时服务器... 但如果您在最终发布之前发布到中间位置,那就太好了。

如果您在一个解决方案中构建+发布多个项目您可以在另一个项目甚至没有构建时发布一个项目。这是因为发布过程实际上是构建过程的扩展。这是一个例子。

您在解决方案中有 ProjectA 和 ProjectB,当您使用上述属性进行构建时,将调用 ProjectA 并将其构建和发布。然后它将转到将构建和发布的 ProjectB。 ProjectB 的构建可能会失败,并且 ProjectA 可能已经发布。

【讨论】:

您也可以针对特定项目。在这里查看我的解决方案:***.com/questions/16891530/…

以上是关于MSBuild 因两个包而失败的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild 找不到代码分析工具

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

SonarQube MSBuild 集成失败:

TeamCity/.sqlproj 通过 MSBuild 构建——失败

TeamCity 构建步骤——在 MSBuild 中失败

网站编译在 MSBuild 中失败,但在 Visual Studio 中有效