Как исключить cshtml из предварительной компиляции во время публикации

У меня есть файлы cshtml в проекте веб-форм С#, которые я хочу опубликовать, используя профиль публикации с параметрами:

  • Разрешить обновление предварительно скомпилированного сайта = false

Я использую Postal вне ASP.net http://aboutcode.net/postal/outside-aspnet.html, так как электронные письма отправляются из фонового процесса. Это использует 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 так же, как файлы изображений, когда для их действия сборки задано содержимое.

Любые идеи?

Изменить: кажется, что у кого-то еще есть точно такая же проблема:

Есть ли способ исключить определенные файлы .cshtm или целую папку из параметра «прекомпиляции», чтобы файлы .cshtml можно было использовать вне MVC?


person Steven Anderson    schedule 20.03.2015    source источник


Ответы (3)


В настоящее время невозможно исключить файлы cshtml (или любые другие) из aspnet_compiler.exe. Это означает, что cshtml будет предварительно скомпилирован вместе со всем остальным — я никак не мог найти способ обойти это.

То, как я заставил это работать, заключалось в том, чтобы развернуть «дополнительные» файлы как часть публикации, а не сделать их частью самого веб-проекта.

В этой статье подробно объясняется, как можно развернуть дополнительные файлы за пределами проекта Visual Studio:

Веб-развертывание ASP.NET с помощью Visual Studio: развертывание дополнительных файлов

В вашем *.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» в родительском каталоге корня вашего веб-проекта, и они будут скопированы во время публикации.

person Steven Anderson    schedule 20.03.2015

Если вы не используете .pubxml, вы можете добавить Target после CopyAllFilesToSingleFolderForMsdeploy в конце файла .csproj. Он копирует данные из любого количества источников в папку пакета после подготовки файлов к упаковке и до начала упаковки:

<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> 
person CrnaStena    schedule 26.07.2018

Представления можно оставить предварительно скомпилированными, когда после публикации файлы представлений для ваших электронных писем снова перезаписываются оригиналами.

Пока я выполняю этот шаг вручную, перезаписывая файлы просмотра электронной почты через FTP.

person Waaghals    schedule 03.05.2017
comment
Если вы проверите выбранный ответ, вы сможете увидеть, как вы можете автоматизировать это как часть своей публикации. - person Steven Anderson; 09.05.2017