我正在尝试通过TFS在 Visual Studio 2012 解决方案中部署一个包含两个网站的项目,作为构建的一部分。我们现在有两个不同的 Web 服务器,WIP
(正在进行中)和DEV
.
我们希望将不同的连接字符串部署到任一服务器,以便它们可以连接到不同的数据库。我们已经在使用 Visual Studio 的开发机器上测试了我们的解决方案,并且对于所有配置,当发布任何 Web 项目时,web.config
当我们检查 Web 服务器时,连接字符串会按预期进行转换。
该构建在WIP
使用默认调试解决方案配置的服务器上运行良好。TFS Build 中的配置是 Any CPU|Debug。
对于下一个配置 ( DEV
),我们确定 Web 项目都通过 Visual Studio 2012 发布到 Web 服务器并且web.config
文件转换。
但是,当我们使用MSBuildDEV
参数运行构建时,我们注意到没有发生任何转换。我们已将构建项目的构建部分中的配置发送到:任何 CPU|Dev。
/p:VisualStudioVersion=10.0 /p:DeployOnBuild=True;PublishProfile=app.ui.dev.pubxml /p:DeployTarget=MsDeployPublish /p:MsDeployServiceUrl=https://server-dev-hrtech:8172/MSDeploy.axd /p:CreatePackageOnPublish=True /p:MSDeployPublishMethod=WMSVC /p:AllowUntrustedCertificate=True /p:Username=username /p:Password=password /p:_WPPCopyWebApplication=True /p:PipelineDependsOnBuild=False
当我们查看构建日志和输出目录时 - 我们可以在目录中看到已编译的程序集,obj/Debug
而不是obj/Dev
我们预期的目录。在日志中,我们可以清楚地看到/p:Configuration="Dev"
我们所期望的。
底线是web.config
最终在 Web 服务器上发布的文件是web.config
来自 Debug 配置的默认文件(即未转换)。就好像 MSBuild 无法看到在解决方案的参数中传递的配置参数。
我现在尝试在我的开发机器上从命令行运行 msbuild,以尝试了解为什么会发生这种情况。
通过剥离通过 TFS 构建发送的 MSBuild 参数,我可以看到这不会改变 Web 配置:
msbuild "app-no database.sln" /t:app_ui:Rebuild /P:TransformConfigFiles=true /p:Configuration=Dev /p:Platform="Any CPU" /p:MSDeployServiceUrl=https://app-dev-hrtech:8172/MSDeploy.axd /p:Username=username /p:Password=password /p:DeployOnBuild=True /p:PublishProfile=app.ui.dev.pubxml /p:VisualStudioVersion=11.0 > build.log
我可以修改它并使用 MSBuild 直接构建项目文件。我发现下面的命令确实转换了web.config
已发布应用程序的文件:
msbuild app.ui\app.ui.csproj /p:Configuration=Dev /p:MSDeployServiceUrl=https://app-dev-hrtech:8172/MSDeploy.axd /p:Username=username /p:Password=password /p:DeployOnBuild=True /p:PublishProfile=app.ui.dev.pubxml /p:VisualStudioVersion=11.0 /p:AllowUntrustedCertificate=True > build.log
问题是这将很难作为 TFS 构建的一部分运行,其中它们是多个项目,其中一些用于网站,另一些用于 Windows 服务器等。
如何使用第一个命令,但对其进行修改以正确转换 Web 项目?
如您所见,我创建了一些发布配置文件,因此它们可能会在 MSBuild 参数以及 TFS 构建中使用。
PS:我们在服务器上使用 Visual Studio 2012、TFS 2010、Windows 2008R2,在开发机器上使用 Windows 7。