ASP.NET Web 部署项目:摆脱 .compiled 文件

Posted

技术标签:

【中文标题】ASP.NET Web 部署项目:摆脱 .compiled 文件【英文标题】:ASP.NET Web Deployment Projects: getting rid of .compiled files 【发布时间】:2009-01-15 15:39:16 【问题描述】:

我在 Visual Studio 2008 中使用 Web 部署项目 来准备我的 ASP.NET 应用程序(ASP.NET Web 应用程序,不是 ASP.NET 网站)用于复制到多个服务器。我必须通过 FTP 将文件复制到本地临时服务器上、不同服务器上,有时我必须从客户的服务器上获取它们。

因此,如果无需在源和目标之间进行大量比较,就可以将所有要部署的文件以紧凑的形式进行部署。 Web 部署项目有一个很好的特性:将所有的 aspx 和 ascx 文件编译成一个(附加的)程序集。

我不知何故在服务器上发现了how to get rid of aspx placeholder files,现在我想知道是否有(可能是自制的)方法来摆脱这些.compiled 文件

来自Rick Strahl's blog:

.Compiled 文件是一个标记文件 对于 Web 中的每个页面和控件 站点并标识使用的类 组件内部。这些文件 不是可选的,因为它们映射 ASPX 页面到适当的预编译 预编译程序集中的类。 如果删除 .Compiled 文件,则 它映射的页面将无法 执行,你会得到一个讨厌的执行 错误。

任何有创意的人,可能使用模块/处理程序拦截对 bin 文件夹中 .compiled 文件的检查?

【问题讨论】:

我和你一样使用 Web 应用程序而不是网站,但我之前从未见过 .compiled 使用 Web 应用程序。但为了部署 aspx/ascx 预编译,我使用部署项目。这里:microsoft.com/DOWNLOADS/… 我在***.com/questions/59191/… 之前问过同样的问题并结束了源代码的部署(我拥有服务器),因为比较部署所需的更改更容易 【参考方案1】:

.compile 文件来自部署时的预编译。所以你基本上有3个选择:

    保留 .compiled 文件 不要预编译和部署源代码 将其转换为 Web 应用程序而不是网站并编译为程序集

我自己也遇到过同样的问题。在处理网站部署时,我实际上在大多数情况下选择了 #1,但在极少数情况下,当我知道我将不得不长时间维护网站时,我会花时间将其升级到 Web申请。

【讨论】:

【参考方案2】:

我也不喜欢 .compiled 文件,但如果它们在那里,没有人会受到伤害。那何必呢?

【讨论】:

这只是......如果只有一个程序集,它们似乎是不必要的。通过 FTP 同步是一个 PITA... 它们不是不必要的!尝试再次阅读 Rick Strahl 粘贴的报价。如果没有 .compiled 文件,asp.net 无法知道哪些 ascx、aspx、ashx 等路径对应于哪些类型。您是否真的尝试过阅读其中一个 .compiled 文件的内容?不管你有一个还是 21242 个不同的程序集,你仍然需要一个 .compiled 文件来为每个类型对应一个 as*x 路径。【参考方案3】:

您可能想看看 ASP.NET 中的Virtual Path Providers (KB how to here)。

此建议的功劳必须转至Cheeso,他在这里自己回答了问题:

Can I get “WAR file” type deployment with ASP.NET?

【讨论】:

【参考方案4】:

我不知道 .compiled 文件,但您可以设置服务器以使用 subversion 更新文件,而不是在编译时手动复制文件。

因此,您将使用 Web 部署项目(而不是单个程序集)编译文件,将它们放入为此目的创建的存储库中,然后在每台服务器上执行 svn update 以自动获取和比较文件.

我知道这不是您直接要求的,但它可能是一条探索之路。

【讨论】:

感谢您的回答。我自己考虑过,但我还没有时间测试它。 这并没有真正起作用,因为 WDP 每次构建搞砸 SVN 都会擦除整个目录 这就是为什么我提到将文件放在另一个存储库中。【参考方案5】:

将“排除过滤器”添加到您的部署项目中:

    在部署项目中。 右键单击内容文件。 点击“排除过滤器”。 添加“*.Compiled” 点击确定。

就是这样。

【讨论】:

问题是,这样的应用程序不再工作了。如果您没有其他机制,则需要它们... 部署 asp.net Web 项目时,您只需要 .aspx、.ascx、.asmx 和配置文件。除此之外的任何东西都是无用的。 @Khaled - 如果您有一个预编译的 Web 项目,您的 as?x 页面也会编译,并替换为 .compiled 占位符。【参考方案6】:

我记得在我不能用 VWD Express 做 Web 应用程序的日子里,我使用 nant 脚本将项目编译成单个 dll 并进行部署,这样就可以了(所以我也不需要完整的 VS 来进行 dll 部署) , 所以如果你真的不想把你的项目弄乱到 Web 应用程序,也许这也是一个检查的路径。

【讨论】:

【参考方案7】:

您可以使用带有-r 选项的aspnet_merge 工具删除.compiled 文件。

删除主代码程序集的 .compiled 文件(App_Code 文件夹中的代码)。如果您的应用程序包含对主代码程序集的显式类型引用,请不要使用此选项。

【讨论】:

很遗憾我的 App_Code 文件夹中没有代码,这是一个 Web 应用程序项目。【参考方案8】:

如果您将代码发布为可更新(在发布设置中),则会生成这些文件。取消选中该值并重新发布。这是我知道的一个老问题,但这里没有明确定义答案。

【讨论】:

以上是关于ASP.NET Web 部署项目:摆脱 .compiled 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 ASP.NET MVC 应用程序发布到 Web 主机 - 在 VS 项目结构中而不是应用程序中部署文件

部署 ASP.NET MVC 项目

请问IIS中如何部署asp.net项目?

ASP.NET Core 反向代理部署知多少

使用 MSBuild 预编译 ASP.NET Web 应用程序

请问如何将VS2010做好的asp.net项目部署到本地的IIS服务器上面