【问题标题】:NAnt MVC publish websiteNAnt MVC 发布网站
【发布时间】:2011-04-22 00:17:10
【问题描述】:

问题:我想用 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 提供的如此出色的正确发布结果?

【问题讨论】:

    标签: .net web nant publish


    【解决方案1】:

    好的,我是在偶然看到这个博客之后才知道的, http://blogs.msdn.com/b/webdevtools/archive/2009/05/04/web-deployment-web-config-transformation.aspx

    在第 4 步中,他显示了一个我以前从未见过的命令行参数, /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" />
    

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

    • OutDir 为您提供 项目“解决方案”。
    • WebProjectOutputDir 为您提供 网络“项目”的最低要求 (即不是整个解决方案)。

    使用 OutDir 的解决方案中的其他项目带来了很多我们不想要的额外包袱,因此我们只是将 OutDir 发送到临时文件夹并删除,如您在上面的步骤中所见。顺便说一句,OutDir 是绝对需要的。如果您删除它,构建将无法工作。似乎 WebProjectOutputDir 在 OutDir 之外工作。

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

    如果有人找到 MSBuild 的一步解决方案,请发布:P 尽管这是一个很好的解决方案,但它仍然只有 99.9999% 完美,并且与上面列出的非常相似,我敢肯定会有一些细微差别或步骤遗漏。

    【讨论】:

      【解决方案2】:

      查看您的解决方案后,我偶然发现了另一个解决方案 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>
      

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

      【讨论】:

      • 哇,谢谢!我会检查它是否可以解决我的问题,如果可以,我会将您的解决方案作为答案。但是请耐心等待,我有大约一千件事要做,因此可能会在 3 周内完成:P
      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多