问题
是否可以使用没有预编译的 Web 部署项目发布 Web 应用程序项目?
笔记
为了将 Web 控件和页面拆分为单独的程序集,我使用自定义 VirtualPathProvider 来加载这些资源。我在 cmd 行使用 web 部署项目和 msbuild 来部署这些项目。
问题的症结在于预编译的应用程序不支持 VirtualPathProviders。我在这里找到了常规文件的解决方法。但是,这不适用于ascx
和aspx
页面等应用程序文件。它会抛出“文件尚未预编译,无法请求”的异常。
因此,我决定尝试完全放弃预编译,因为我们的网站流量并不是特别高,所以最初的请求性能受到了影响。但是,我不知道如何使用 Web 部署项目来做到这一点,这些项目已经非常融入我们的构建过程。
[更新]我正在考虑自定义 Microsoft.WebDeployment.targets 文件以完成此操作,但到目前为止我还没有运气。
[更新]在挖掘 Microsoft.WebDeployment.targets 文件时,我发现没有直接的方法可以将 Web 部署项目与 Web 应用程序预编译分离。事实上,我不确定有没有必要。我现在使用的是类似于以下代码段的东西。我只是将其放入项目文件中,并带有一个条件 attr 以不部署用于调试构建。
<Target Name="AfterBuild">
<!-- clean output dir -->
<CreateItem Include="$(output)**\*.*">
<Output TaskParameter="Include" ItemName="OldFiles"/>
</CreateItem>
<Delete ContinueOnError="true"
TreatErrorsAsWarnings="true" Files="@(OldFiles)"/>
<!-- copy content -->
<Copy SourceFiles="@(Content)"
DestinationFolder="$(output)%(Content.RelativeDir)" />
<CreateItem Include="$(OutputPath)\*">
<Output TaskParameter="Include" ItemName="Binaries" />
</CreateItem>
<Copy SourceFiles="@(Binaries)" DestinationFolder="$(output)bin" />
<ReplaceConfigSections RootPath="$(output)"
WebConfigReplacementFiles="@(ConfigFiles)"
UseExternalConfigSource="true"
ValidateSectionElements="true"/>
</Target>
似乎这就是在没有预编译的情况下部署项目所需要的一切。如果你发现更好的东西,请告诉我。