我正在使用vs 2010并拥有一个Web应用程序项目。 我目前使用“web deploy”选项在项目上右键单击“发布”选项,将整个应用程序发布到运行msdeploy.axd的服务器。
我必须多次发布此项目(100+),每次只更改web.config。
我正在研究应该使用什么技术来自动化这个过程。我更愿意使用标准的MS技术。
我应该看看MSBuild吗? VS命令提示符? (这些是相同的吗?)
我应该学习哪种技术来最好地自动化这种情况。我正在寻找最标准的方法......
在我脑海中,我要写的剧本将是:
感谢任何帮助。
答案 0 :(得分:2)
我已经使用MSBuild做了这件事。我的案件涉及的步骤是:
web.config模板有这样的东西:
In the connection string: "Data Source=${SQLINSTANCE};Initial Catalog=${SQLDATABASENAME}..."
重要的是,可替换令牌的分隔符是$ {}而不是$(),因为MSBuild不会弄乱大括号。
在“发布”步骤中,使用MSBuild属性函数替换配置文件中的位,以下内容取自MSDN对MSBuild内联任务的描述:
<UsingTask
TaskName="ReplaceToken"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
<ParameterGroup>
<File ParameterType="System.String" Required="true" />
<Token ParameterType="System.String" Required="true" />
<Replacement ParameterType="System.String" Required="true" />
</ParameterGroup>
<Task>
<Code Type="Fragment" Language="cs">
<![CDATA[
string content = File.ReadAllText(File);
content = content.Replace(Token, Replacement);
File.WriteAllText(File, content);
]]>
</Code>
</Task>
</UsingTask>
然后在您的项目中,您可以使用此任务,
<ReplaceToken
File="PathTo\Web.config"
Token="${SQLINSTANCE}"
Replacement=".\SQLEXPRESS"
/>
这实际上只是一个粗略的指南,ReplaceToken的所有参数也在MSBuild项元数据中配置,允许选择哪些数据库,服务器,安全性等,每个都可以单独指定。
因此,对于每个构建/部署,它将执行构建,复制配置模板,对它们执行字符串替换,然后自动执行Package / Publish,这是最后一点。
你最好的选择是从这个博客开始:http://vishaljoshi.blogspot.com/2009/02/web-packaging-creating-web-packages.html解释了一下,这个答案包含了许多其他相关的StackOverflow帖子MsBuild and MsDeploy with multiple environments,然后用{{在线搜索3}}深入挖掘。我真的很讨厌把你转移到这个部分的搜索引擎,但我发现有很多不同的场景,很难单出一个。十大回复中约有一半对某些有价值的角度有所了解。回复更多信息,以帮助缩小我的响应。对于我的实现,我使用Exec任务直接从MSBuild调用了MSDeploy.exe。有些事情需要考虑:
希望这能让你开始。如果我确实遗漏或掩饰了某些内容,请在您的问题中发表评论或提供更多详细信息。
对评论的回应:
“发布”目标就是这些行,
<Target Name="Publish">
<!-- token replacement in config files, as above -->
<!-- ...lots of custom setup, selection of various properties used below -->
<PropertyGroup>
<_MsDeployExe>$(PROGRAMFILES)\IIS\Microsoft Web Deploy\msdeploy</_MsDeployExe>
<_MsDeploySourceArg>-source:contentpath="$(_BuildDropFolder)"</_MsDeploySourceArg>
<_MsDeployDestArg>-dest:contentpath=\\$(_RemoteComputerName)\DropFolder</_MsDeployDestArg>
</PropertyGroup>
<Message
Text=""$(_MsDeployExe)" -verb:sync $(_MsDeploySourceArg) $(_MsDeployDestArg)"
/>
<Exec
Condition="'$(DryRun)' != 'true'"
Command=""$(_MsDeployExe)" -verb:sync $(_MsDeploySourceArg) $(_MsDeployDestArg)"
ContinueOnError="false"
WorkingDirectory="$(MSBuildThisFileDirectory)"
/>
</Target>