NAnt MVC 发布网站

Posted

技术标签:

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

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

简单不?错了......这是我看过的一些***资源。他们每个人都有一个问题......

*** 1: Publish WebApplication using NAnt

这个结果是 web.config 没有被转换,并且在 bin 中显示了其他文件,这些文件不应该像所有东西一样喜欢 entity.dll.config!

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

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

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

公认的解决方案建立在 *** 1 之上,但是是纯 MsBuild xml 而不是 NAnt xml。它也只修复了 Webconfig,因此仍然保留了显示的那些随机文件。 pattersonc 还提供了另一种解决方案(不接受),它非常非常接近正确,但 web.config 中的连接字符串处于虚假的边缘状态,给您留下另一个错误的 web.config

不用说已经 3-4 天了,10 多个不同的 *** 答案,没有灵丹妙药......没有简单的解决方案吗?我是否必须犯下一些大罪并创建一些非常混乱的 NAnt 脚本才能实现 VS2010 提供的如此出色的正确发布结果?

【问题讨论】:

【参考方案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://***.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

以上是关于NAnt MVC 发布网站的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 2010 上发布网站失败 (MVC3)

发布网站使用 ASP mvc 和 Angular 2

.NET MVC3网站发布到IIS,访问后台404

ASP.NET MVC 网站视图模型在发布后未更新,但在发布中运行良好

在构建后事件中使用命令部署 asp.net mvc 网站

在 MVC 网站的静态分析 (FxCop) 中包含 aspx