NAnt MVC发布网站

Thi*_*lan 6 .net nant publish web

问题:我想优雅地发布一个带有NAnt的MVC网站.

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

Stackoverflow 1: 使用NAnt发布WebApplication

这个的结果是web.config没有被转换,并且其他文件显示在bin中,并不是想要所有东西的entity.dll.config!

Stackoverflow 2: 从命令行复制VS2008"发布网站"

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

Stackoverflow 3: MSBuild脚本和VS2010发布应用Web.config转换

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

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

Thi*_*lan 6

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

在步骤4中,他显示了一个我以前没见过的命令行arg,/ t: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" />
Run Code Online (Sandbox Code Playgroud)

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

  • OutDir为您提供项目"解决方案"中的所有内容.
  • WebProjectOutputDir为您提供Web"项目"的最低限度(即不是整个解决方案).

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

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

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