我已经看过一些问题,阅读了所有帖子,但仍然无法完成。要么我错过了什么,要么就是不能做到......
所以我有一个相当简单的(ASP.NET MVC)项目。 在我的项目的根目录中有一个带有参数定义的parameters.xml文件,例如:
<?xml version="1.0" encoding="utf-8" ?>
<parameters>
<parameter
name="Realm"
description="Realm for ADFS authentication"
defaultValue="http://somewebsite">
<parameterEntry
kind="XmlFile"
scope="Web.config"
match="/configuration/appSettings/add[@key='ida:Realm']/@value" />
<parameterEntry
kind="XmlFile"
scope="Web.config"
match="/configuration/system.identityModel/identityConfiguration/audienceUris/add/@value" />
<parameterEntry
kind="XmlFile"
scope="Web.config"
match="/configuration/system.identityModel.services/federationConfiguration/wsFederation/@realm" />
到目前为止一切顺利。这个结构很好理解,你是一个部署参数的名称(例如&#34; Realm&#34;),它是一个默认值,还有一些XCLT选项,可以在Web.config文件中找到它。
现在,当我创建一个部署包时,通过运行Publish,我得到一个包含以下内容的目录:
最后一个文件包含我在上面引用的parameters.xml文件中设置的参数值,这些值被设置为在那里定义的默认值。
例如如果Realm的默认值设置为http://somewebsite,则在生成的部署SetParameters.xml中,我将获得此记录:
<setParameter name="Realm" value="http://somewebsite" />
当部署包时,这些值将从此xml文件中获取,并根据原始parameter.xml文件中定义的XPath替换Web.Config中的值。
现在,我想要的是在构建部署包时覆盖这些参数(以及许多其他参数),因为我需要为不同的部署配置文件使用不同的值。
密钥似乎是我的.pubxml文件,它负责发布设置。我尝试了很多选项,包括Sayed Hashimi所说的here,以前的答案here和here,here too(还有其他人)...似乎没什么区别该死的参数!
我错过了什么吗?有一些神奇的黑客攻击吗? 我应该完全忽略params并且只依赖于匹配的web.config转换吗?还有其他建议吗?也许在.csproj文件中添加自定义目标? (甚至试过......)
谢谢! 阿龙。
答案 0 :(得分:2)
WebDeploy参数化发生在部署时而不是构建时(如配置转换)。我们在工作中使用参数化50多种产品并取得了巨大成功。对于每个产品,我们有4个SetParameters文件:
每个都有对其环境有效的参数值。我们使用PowerShell脚本和Thoughtworks GO来使用适当的SetParameters文件在管道中执行MSDeploy包。
请注意,请务必不要在应用中部署SetParameters文件 - http://dotnetcatch.com/2016/04/02/webdeploy-parameterization-tip-dont-publish-your-parameterization-files/
此外,如果您想在VS中预览参数化,这可能会有所帮助 - http://dotnetcatch.com/2014/09/08/parameterizationpreview-visual-studio-extension/