NAnt MVC发布网站

时间:2011-04-22 00:17:10

标签: .net web nant publish

问题:我想用NAnt优雅地发布MVC网站。

简单没有?错了......以下是我看过的一些stackoverflow资源。他们每个人都有一个问题......

Stackoverflow 1: Publish WebApplication using NAnt

这个的结果是web.config没有被转换,并且其他文件出现在bin中,而不是像所有的entity.dll.config一样!

Stackoverflow 2: Replicate VS2008 "Publish Web Site" from command line

这个将与之前的解决方案相同,除非它更糟糕......它将从我的项目中复制一切并将其转储到发布文件夹中......不是开玩笑!

Stackoverflow 3: MSBuild Script and VS2010 publish apply Web.config Transform

接受的解决方案建立在Stackoverflow 1之上,但是纯粹的MsBuild xml而不是NAnt xml。它还只修复了Webconfig,因此仍然保留了显示的随机文件。 pattersonc还提供了另一个解决方案(不接受),它非常非常接近正确,但web.config中的连接字符串处于虚假状态,让你又有了一个糟糕的web.config

毋庸置疑,已经有3-4天,10多个不同的StackOverFlow答案,没有银弹......难道没有简单的解决方案吗?我是否必须犯下一些重大罪恶并创建一些可怕的混乱NAnt脚本来实现VS2010提供的正确发布结果?

2 个答案:

答案 0 :(得分:6)

好吧,我在这篇博客上查了一下后发现了 http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx

在步骤4中,他显示了一个我以前没见过的命令行arg, /吨:TransformWebConfig

不幸的是,仅凭这一点并不能解决问题。它确实执行转换,但转换可在obj / Release / TransformWebConfig / transformed / Web.config(obj / Release或obj / Debug或obj / YourTranformName)中找到。

所以最终得到一个体面的解决方案,这就是我必须要做的事情。

<exec program="${exec.msbuild}" failonerror="true">
    <arg value="${path.sourceCode}/ProjectFolder/Project.csproj" />
    <arg value="/p:Configuration=Release" />
    <arg value="/t:ResolveReferences" />
    <arg value="/t:_CopyWebApplication" />
    <arg value="/t:TransformWebConfig" />
    <arg value="/p:OutDir=${path.buildFromProject}/temp/" />
    <arg value="/p:WebProjectOutputDir=${path.buildFromProject}/ProjectBuild/" />
</exec>

<delete dir="${path.build}/temp" failonerror="true"/>
<delete file="${path.build}/ProjectBuild/Web.config" failonerror="true"/>
<delete file="${path.build}/ProjectBuild/Web.Debug.config" failonerror="true"/>
<delete file="${path.build}/ProjectBuild/Web.Release.config" failonerror="true"/>
<copy file="${path.sourceCode}/ProjectFolder/obj/Release/TransformWebConfig/transformed/Web.config" tofile="${path.build}/ProjectBuild/Web.config" />

请注意,OutDir与WebProjectOutputDir不同。这就是为什么:

  • OutDir 为您提供了所有内容 项目“解决方案”。
  • WebProjectOutputDir 为您提供 网络“项目”的最低限度 (即不是整个解决方案)。

使用我们不想要的OutDir从解决方案中的其他项目中获得了很多额外的包袱,所以我们只是将OutDir发送到临时文件夹并删除,如上面的步骤所示。 OutDir绝对是必需的。如果删除它,构建将不起作用。似乎WebProjectOutputDir使用OutDir。

整个设置只有一个小缺陷。 bin库中缺少许多pdb文件。复制的唯一pdb是来自Web项目的那个。

如果有人发现MSBuild的一步解决方案,请发布:P 虽然这是一个很好的解决方案,它仍然只有99.9999%完美,就像上面列出的那些我肯定会有一些细微差别或步骤错过。

答案 1 :(得分:3)

在查看解决方案后,我偶然发现了另一个解决方案https://stackoverflow.com/a/2953376/662853

我修改了你的答案,改为使用_WPPCopyWebApplication目标:

<exec program="${exec.msbuild}" failonerror="true">
    <arg value="${path.sourceCode}/ProjectFolder/Project.csproj" />
    <arg value="/p:Configuration=Release" />
    <arg value="/t:ResolveReferences" />
    <arg value="/t:_WPPCopyWebApplication" />
    <arg value="/t:TransformWebConfig" />
    <arg value="/p:OutDir=${path.buildFromProject}/temp/" />
    <arg value="/p:WebProjectOutputDir=${path.buildFromProject}/ProjectBuild/" />
</exec>

经过测试,我不再需要删除配置并复制转换后的文件。