9

好的,这是一个很棒的错误。我有一个在 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 文件夹中,反之亦然,但这似乎不是一个非常优雅的解决方案。任何人都可以重现这种行为吗?有没有人有更优雅的修复?我错过了什么吗?

提前致谢。

4

1 回答 1

16

当您通过命令行传递属性时,它们是全局 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。

免责声明

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

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

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

于 2013-01-09T09:14:04.333 回答