如何在发布期间从预编译中排除cshtml

时间:2015-03-20 05:52:12

标签: visual-studio razor hangfire postal

我在c#web表单项目中有cshtml文件,我想使用包含以下选项的发布配置文件发布:

  • 允许预编译的网站可更新= false

我在ASP.net http://aboutcode.net/postal/outside-aspnet.html之外使用Postal,因为正在发送的电子邮件来自后台进程。这是使用hangfire并且非常类似于:http://docs.hangfire.io/en/latest/tutorials/send-email.html

问题是当我不想要它时,cshtml文件正在被预编译,并且文件的结果内容是:

  

这是预编译工具生成的标记文件,不应删除!

我需要原始cshtml文件的全部内容,并且不想要标记内容,但我还想保留Allow precompiled site to be updateable = false的设置,以便无法更新所有其他文件。

我能看到的唯一方法是Allow precompiled site to be updateable = true

简而言之,我想以与构建操作设置为内容时图像文件相同的方式部署cshtml。

有什么想法吗?

修改 似乎其他人有完全相同的问题:

Is there a way to exclude certain .cshtm files, or an entire folder, from the 'precompile' option so that the .cshtml files can be used outside MVC?

3 个答案:

答案 0 :(得分:2)

目前,没有办法从aspnet_compiler.exe中排除cshtml(或任何其他)文件。这意味着cshtml将与其他所有内容一起进行预编译 - 我无法找到解决问题的方法。

我使用它的方法是在发布过程中部署“额外”文件,而不是让它们成为Web项目本身的一部分。

本文详细介绍了如何在visual studio项目之外部署额外文件:

ASP.NET Web Deployment using Visual Studio: Deploying Extra Files

在* .pubxml

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>UAT</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\Publish\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <PrecompileBeforePublish>True</PrecompileBeforePublish>
    <EnableUpdateable>False</EnableUpdateable>
    <DebugSymbols>False</DebugSymbols>
    <WDPMergeOption>DonotMerge</WDPMergeOption>
  </PropertyGroup>
  <Target Name="CustomCollectFiles">
    <ItemGroup>
      <_CustomFiles Include="..\ExtraFiles\**\*" />
      <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>    
    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
  </PropertyGroup>
</Project>

将“额外文件”放在名为“ExtraFiles”的文件夹中,放在网络项目根目录的父目录中,并在发布过程中复制它们。

答案 1 :(得分:1)

如果不使用.pubxml,则可以在.csproj文件末尾CopyAllFilesToSingleFolderForMsdeploy之后添加Target。在准备好要打包的文件之后以及开始打包之前,它将数据从任意数量的源复制到package文件夹:

<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
    <Message Text="AdditionalFilesForPackage(): MSBuildProjectDirectory -&gt; $(MSBuildProjectDirectory)" />
    <Message Text="AdditionalFilesForPackage(): _PackageTempDir -&gt; $(_PackageTempDir)" />
    <ItemGroup>
        <FolderFiles Include="$(MSBuildProjectDirectory)\FolderName\**\*" />
        <OtherCshtmlFiles Include="$(MSBuildProjectDirectory)\OtherCshtml\**\*" />
    </ItemGroup>
    <Copy SourceFiles="@(FolderFiles)" DestinationFiles="@(FolderFiles->'$(_PackageTempDir)\FolderName\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Message Text="AdditionalFilesForPackage(): Done copying FolderName files." />
    <Copy SourceFiles="@(OtherCshtmlFiles)" DestinationFiles="@(OtherCshtmlFiles->'$(_PackageTempDir)\OtherCshtml\%(RecursiveDir)%(Filename)%(Extension)')" />
    <Message Text="AdditionalFilesForPackage(): Done copying OtherCshtml files." />
</Target> 

答案 2 :(得分:0)

在发布后,您的电子邮件视图文件会再次被原始文件覆盖,因此可以预先编译视图。

我现在手动执行此步骤,方法是通过FTP覆盖电子邮件视图文件。