如何在发布期间从预编译中排除 cshtml
How to exclude cshtml from pre compilation during publish
我在 c# web 表单项目中有 cshtml 文件,我想使用具有以下选项的发布配置文件发布这些文件:
- 允许预编译站点可更新 = false
我在 ASP.net http://aboutcode.net/postal/outside-aspnet.html as the emails that are being sent are from a background process. This is using hangfire and is very similar to this: http://docs.hangfire.io/en/latest/tutorials/send-email.html
之外使用邮政
问题是 cshtml 文件在我不希望被预编译时被预编译,文件的结果内容是:
This is a marker file generated by the precompilation tool, and should not be deleted!
我需要原始 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?
目前,无法从 aspnet_compiler.exe 中排除 cshtml(或任何其他)文件。这意味着 cshtml 将与其他所有内容一起预编译 - 我无法找到绕过它的方法。
我实现它的方法是部署 'extra' 文件作为发布的一部分,而不是让它们成为 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>
将您的 'extra files' 放在 Web 项目根目录的父目录中名为 'ExtraFiles' 的文件夹中,它们将在发布期间被复制。
当发布后,您的电子邮件的视图文件再次被原始文件覆盖时,视图可以保持预编译。
我现在手动执行此步骤,通过 FTP 覆盖电子邮件视图文件。
如果您不使用 .pubxml,您可以在 .csproj 文件末尾的 CopyAllFilesToSingleFolderForMsdeploy
之后添加 Target。它将数据从任意数量的源复制到包文件夹,在文件准备好打包之后和打包开始之前:
<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
<Message Text="AdditionalFilesForPackage(): MSBuildProjectDirectory -> $(MSBuildProjectDirectory)" />
<Message Text="AdditionalFilesForPackage(): _PackageTempDir -> $(_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>
就我而言(我没有直接使用 RazorViewEngine,而是从文件系统加载 .cshtml)。我将 .cshtml
更改为 .html
,它不再是编译的一部分。
我在 c# web 表单项目中有 cshtml 文件,我想使用具有以下选项的发布配置文件发布这些文件:
- 允许预编译站点可更新 = false
我在 ASP.net http://aboutcode.net/postal/outside-aspnet.html as the emails that are being sent are from a background process. This is using hangfire and is very similar to this: http://docs.hangfire.io/en/latest/tutorials/send-email.html
之外使用邮政问题是 cshtml 文件在我不希望被预编译时被预编译,文件的结果内容是:
This is a marker file generated by the precompilation tool, and should not be deleted!
我需要原始 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?
目前,无法从 aspnet_compiler.exe 中排除 cshtml(或任何其他)文件。这意味着 cshtml 将与其他所有内容一起预编译 - 我无法找到绕过它的方法。
我实现它的方法是部署 'extra' 文件作为发布的一部分,而不是让它们成为 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>
将您的 'extra files' 放在 Web 项目根目录的父目录中名为 'ExtraFiles' 的文件夹中,它们将在发布期间被复制。
当发布后,您的电子邮件的视图文件再次被原始文件覆盖时,视图可以保持预编译。
我现在手动执行此步骤,通过 FTP 覆盖电子邮件视图文件。
如果您不使用 .pubxml,您可以在 .csproj 文件末尾的 CopyAllFilesToSingleFolderForMsdeploy
之后添加 Target。它将数据从任意数量的源复制到包文件夹,在文件准备好打包之后和打包开始之前:
<Target Name="AdditionalFilesForPackage" AfterTargets="CopyAllFilesToSingleFolderForMsdeploy">
<Message Text="AdditionalFilesForPackage(): MSBuildProjectDirectory -> $(MSBuildProjectDirectory)" />
<Message Text="AdditionalFilesForPackage(): _PackageTempDir -> $(_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>
就我而言(我没有直接使用 RazorViewEngine,而是从文件系统加载 .cshtml)。我将 .cshtml
更改为 .html
,它不再是编译的一部分。