ASP.NET Web应用程序(MVC)部署自动化和Subversion
|
我们正在尝试将构建过程自动化到我们的临时服务器,但是遇到了一个障碍,虽然相当小.我们使用VS2010内置的Publish功能,提交Subversion,然后第三方应用程序(Beanstalk)自动提取更新的文件并将它们FTP到Staging服务器. 我们遇到的问题是我们似乎只有以下选择: >(2个邪恶中的较小者)如果我们选择使用“用本地副本替换匹配的文件”,这很有效,但有一个例外:此选项不会删除从项目中删除的任何文件.这将导致从旧时代的不整洁文件的垃圾和/或安全问题. 我的问题:是否有一个简单的解决方法,或者我们忽略的完全不同的部署选项(我们不希望从VS直接发布到服务器,因为我们想要跟踪部署发生的人/什么/何时)?我唯一遇到的是在发布之前手动删除文件内容,同时保持文件夹结构不变,然后部署“使用本地副本替换匹配的文件”.不幸的是,这带来了“自动化”一词的全新含义. 关于如何最好地实现这一点的任何想法? 解决方法您可能需要考虑使用NAnt或类似的东西来完成您希望自动化的任务,例如构建和发布到Subversion.这是WebApplication Project的大部分构建文件. MVC可能有所不同.如果是这样,我相信你可以用这个作为起点.我绝不是NAnt专家所以可能存在一些缺陷,但这对我来说肯定有用.我不得不将PublishToFileSystem目标添加到我想要发布的每个.csproj文件中.它的来源可以be found here. Build file also available on Pastebin <?xml version="1.0"?>
<project name="deploy" default="all">
<property name="nant.settings.currentframework" value="net-4.0" />
<!-- Any of these can be passed through the command line -->
<property name="sourceDirectory" value="${project::get-base-directory()}" />
<property name="publishDirectory" value="${sourceDirectory}build" />
<property name="MSBuildPath" value="${framework::get-assembly-directory(framework::get-target-framework())}msbuild.exe" />
<!-- The build configuration to use when publishing and transforming the web.config file. This is useful when you have multiple environments for which you create builds -->
<property name="buildConfiguration" value="Release" />
<!-- Set these as needed -->
<property name="svn.username" value="" />
<property name="svn.password" value="" />
<target name="SvnPrep">
<property name="svn.dir" value="${publishDirectory}.svn" />
<property name="svn.update" value="true" readonly="false" />
<echo>env.svn.path = svn</echo>
<echo>svn.dir = ${svn.dir}</echo>
<mkdir dir="${publishDirectory}" unless="${directory::exists(publishDirectory)}" />
<!-- Check if there's a .svn dir already. If not: checkout,else: update. -->
<if test="${not directory::exists(svn.dir)}">
<exec program='svn.exe' workingdir="${publishDirectory}" verbose="true">
<arg line='co ${svn.builduri} --username ${svn.username} --password ${svn.password} --non-interactive ./' />
</exec>
<property name="svn.update" value="false" readonly="false" />
</if>
<if test="${svn.update}">
<exec program='svn.exe' workingdir="${publishDirectory}" verbose="true">
<arg line='up --username ${svn.username} --password ${svn.password} --non-interactive --force ./' />
</exec>
</if>
<!-- Force any conflicts to be resolved with the most recent code -->
<exec program='svn.exe' workingdir="${publishDirectory}" verbose="true">
<arg line='resolve --accept theirs-full -R ./' />
</exec>
</target>
<target name="DeleteFiles">
<!-- Delete only the files (retain directory structure) in the directory to which you are going to publish/build. NAnt excludes svn directories by default. -->
<delete includeemptydirs="false">
<fileset basedir="${publishDirectory}">
<include name="**/*.*" />
</fileset>
</delete>
</target>
<target name="Publish">
<!-- I know there's an MSBuild task,I don't know why I didn't use it,but this works. -->
<!-- Build and publish frontend -->
<exec program="${MSBuildPath}">
<arg line='"${sourceDirectory}YourProject.csproj"' />
<arg value='"/p:Platform=AnyCPU;Configuration=${buildConfiguration};PublishDestination=${publishDirectory}"' />
<arg value="/target:PublishToFileSystem" />
</exec>
<!-- Transform the correct web.config and copy it to the build folder. PublishToFileSystem doesn't transform the web.config,unfortunately. -->
<exec program="${MSBuildPath}">
<arg line='"${sourceDirectory}YourProject.csproj"' />
<arg value='"/p:Platform=AnyCPU;Configuration=${buildConfiguration};PublishDestination=${publishDirectory}"' />
<arg value="/target:TransformWebConfig" />
</exec>
<copy file="${sourceDirectory}YourProjectobj${buildConfiguration}TransformWebConfigtransformedWeb.config" tofile="${publishDirectory}YourProjectweb.config" overwrite="true" />
</target>
<target name="SvnCommit">
<!-- add any new files -->
<exec program='svn.exe' workingdir="${publishDirectory}" verbose="true">
<arg line='add --force .' />
</exec>
<!-- delete any missing files,a modification of this https://stackoverflow.com/questions/1071857/how-do-i-svn-add-all-unversioned-files-to-svn -->
<!-- When there's nothing to delete it looks like this fails (to NAnt) but it is actually fine,that's why failonerror is false -->
<exec program='cmd.exe' workingdir="${publishDirectory}" verbose="true" failonerror="false"
commandline='/C for /f "usebackq tokens=2*" %i in (`svn status ^| findstr /r "^!"`) do svn del "%i %j"' >
</exec>
<exec program='svn.exe' workingdir="${publishDirectory}" verbose="true">
<arg line='commit -m "Automated commit from build runner"' />
</exec>
</target>
<target name="ShowProperties">
<script language="C#" prefix="util" >
<code>
<![CDATA[
public static void ScriptMain(Project project)
{
foreach (DictionaryEntry entry in project.Properties)
{
Console.WriteLine("{0}={1}",entry.Key,entry.Value);
}
}
]]>
</code>
</script>
</target>
<target name="all">
<call target="ShowProperties" />
<call target="SvnPrep" />
<call target="DeleteFiles" />
<call target="Publish" />
<call target="SvnCommit" />
</target>
</project> (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – TempData:安全吗?
- asp.net-mvc – LabelFor和TextBoxFor不生成相同的id
- asp.net按钮点击w / javascript“你确定吗?”在发回之前
- asp.net-mvc – 如何在控制器中显示警报消息
- asp.net – 单元测试Web服务 – HttpContext
- asp.net-mvc-routing – 如何防止Url.RouteUrl(…)从当前请
- asp.net-mvc-3 – MVC3 Html.ActionLink Post
- asp.net-mvc – 单元测试视图?
- asp.net-web-api – 基于参数类型重载Web api操作方法
- asp.net-mvc-5 – 在禁用的TextBoxFor中只读是什么?
