Исключить файлы из публикации на веб-сайте в Visual Studio

79

Могу ли я исключить папку или файлы при публикации веб-сайта в Visual Studio 2005? У меня есть различные ресурсы, которые я хочу держать под рукой в ​​обозревателе решений, например альтернативные файлы конфигурации для различных сред, но я действительно не хочу публиковать их на сервере. Есть ли способ их исключить? При использовании других типов проектов, таких как сборка .dll, я могу установить для свойства Build Action файла значение «None», а для его свойства Copy to Output Directory - значение «Do not copy». Я не могу найти подобных настроек для файлов на веб-сайте.

Если IDE не предлагает эту функцию, есть ли у кого-нибудь хороший способ работы с такими файлами?

Джим Снайдер
источник
3
Здесь вы можете найти очень простое решение: stackoverflow.com/questions/1288858/…
Дмитрий Мельник

Ответы:

32

Если вы можете идентифицировать файлы по расширению, вы можете настроить это с помощью тега buildproviders в файле web.config . Добавьте расширение и сопоставьте его с ForceCopyBuildProvider. Например, чтобы настроить файлы .xml для копирования с действием публикации, вы должны сделать следующее:

<configuration>...
    <system.web>...
        <compilation>...
            <buildProviders>
                <remove extension=".xml" />
                <add extension=".xml" type="System.Web.Compilation.ForceCopyBuildProvider" />
            </buildProviders>

Чтобы предотвратить копирование данного файла, вы должны сделать то же самое, но использовать System.Web.Compilation.IgnoreFileBuildProvider в качестве типа.

Крис Хайнс
источник
Очень круто. Не повезло с рекомендуемыми ExcludeFromPackageFiles в файле wpp.targets. Последний вариант довольно бесполезен, поскольку не поддерживает подстановочные знаки для папок глубиной более одного уровня. Спасибо
DvS
128

Исключение файлов и папок путем добавления ExcludeFilesFromDeploymentи ExcludeFoldersFromDeploymentэлементы в файл проекта (.csproj, .vbproj и т.д.). Вам нужно будет отредактировать файл в текстовом редакторе или в Visual Studio, выгрузив проект и отредактировав его.

Добавьте теги в любом месте подходящего PropertyGroup(Отладка, Выпуск и т. Д.), Как показано ниже:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
  ... 
  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
  <ExcludeFilesFromDeployment>**\.svn\**\*.*</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment> 
</PropertyGroup>

Подстановочные знаки поддерживаются.

Чтобы объяснить приведенный выше пример:

  • Первый ExcludeFilesFromDeploymentисключает File1.aspx(в корне проекта) и Folder2\File2.aspx( Folder2находится в корне проекта)
  • Второй ExcludeFilesFromDeploymentисключает все файлы в любой названной папке .svnи любой из ее подпапок.
  • В ExcludeFoldersFromDeploymentисключает папки с именами Folder1(в корне проекта) и Folder2\Folder2a( Folder2в корне проекта)

Для получения дополнительной информации см. Сообщение в блоге MSDN. Веб-развертывание: исключение файлов и папок через файл проекта веб-приложения.

Кит
источник
1
Есть ли способ использовать с этим подстановочные знаки пользователя?
roydukkey
4
Для меня это намного лучше, чем принятый ответ, поскольку я хочу исключить файл Web.config во время публикации!
Майкл Икинс
6
В проектах типа «Веб-сайт» этот фрагмент кода добавляется в файлы * .pubxml, расположенные в ~ / App_Data / PublishProfiles /.
laylarenee
4
В веб-приложении вы можете добавить эти элементы в PropertyGroup своего публикуемого профиля @ ~ \ Properties \ PublishProfiles
ExecutionOrder
6
Есть ли способ сделать это через пользовательский интерфейс, а не напрямую редактировать файл проекта?
Kurren
35

Удивительно, но ответа для Visual Studio 2012 здесь нет:

  • Ответ с зеленой галочкой не является ответом.

  • Самый высокий «повышенный» ответ ссылается на статью 2010 года, в которой говорится, что вам нужно отредактировать файл проекта csproj, который теперь неверен. Я добавил XML-элемент ExcludeFoldersFromDeployment в свой файл csproj Visual Studio 2012, и он ничего не сделал, элемент считался недопустимым, потому что ExcludeFoldersFromDeployment был перемещен в файл .pubxml, как он выглядит.

Для веб-приложений и веб-сайтов вы редактируете файл .pubxml!

Вы можете следовать моему ответу или попробовать это руководство, которое я нашел позже: http://www.leniel.net/2014/05/using-msdeploy-publish-profile-pubxml-to-create-an-empty-folder-structure- on-iis-and-skip-deleting-it-with-msdeployskiprules.html # sthash.MSsQD8U1.dpbs

Да, вы можете сделать это не только для веб-проектов, но и для веб-сайтов. Я провел много времени в Интернете в поисках этой неуловимой возможности исключения с помощью веб-сайта Visual Studio (НЕ проекта веб-сайта) и ранее пришел к выводу, что это невозможно, но похоже, что это так:

В файле [mypublishwebsitename] .pubxml, который находится в ~ / Properties / PublishProfiles для проектов веб-приложений и ~ / App_Data / PublishProfiles для веб-сайтов, просто добавьте:

  <ExcludeFilesFromDeployment>File1.aspx;Folder2\File2.aspx</ExcludeFilesFromDeployment> 
 <ExcludeFoldersFromDeployment>Folder1;Folder2\Folder2a</ExcludeFoldersFromDeployment>

как дети к главному <PropertyGroup> элементу в вашем .pubxml файле. Нет необходимости добавлять новый элемент, если только вы не используете определенный тип сборки, например выпуск или отладку.

НО ЖДАТЬ!!!

Если вы удаляете файлы с целевого / целевого сервера со следующими настройками в конфигурации публикации:

введите описание изображения здесь

Затем процесс веб-публикации удалит на вашем исходном / целевом сервере все исключенное, например, элемент, который вы обозначили в своих <ExcludeFoldersFromDeployment>и<ExcludeFilesFromDeployment> !

Правила пропуска MsDeploy спешат на помощь:

Во-первых, Web Publish для публикации использует что-то другое, кроме MSBuild (так называемый Task IO или что-то в этом роде), но в нем есть ошибка и он не распознает правила пропуска, поэтому вы должны добавить в свой .pubxml:

<PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
</PropertyGroup>

Я бы оставил <WebPublishMethod>свой собственный <PropertyGroup>, вы могли бы подумать, что у вас может быть только один <PropertyGroup>элемент в вашем .pubxml, но мои правила пропуска не вызывались, пока я не перешел <WebPublishMethod>к его собственному <PropertyGroup>элементу. Да, безумие, но тот факт, что вам нужно сделать все это для Web Publish, чтобы исключить, а также не удалить папку / файл на вашем сервере, безумие.

Теперь мои фактические объявления SkipRules, ExcludeFolders и ExcludeFiles в моем .pubxml:

<ExcludeFoldersFromDeployment>Config</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Photos</ExcludeFoldersFromDeployment>
<ExcludeFoldersFromDeployment>Temp</ExcludeFoldersFromDeployment>
<ExcludeFilesFromDeployment>Web.config</ExcludeFilesFromDeployment>
 <AfterAddIisSettingAndFileContentsToSourceManifest>AddCustomSkipRules</AfterAddIisSettingAndFileContentsToSourceManifest>

А теперь правила пропуска ( <Target>являются дочерними для <Project>вашего .pubxml): ( Вы можете оставить <SkipAction>пустым, чтобы пропустить все действия, но я не проверял это и не уверен.

  <Target Name="AddCustomSkipRules">
    <Message Text="Adding Custom Skip Rules" />
    <ItemGroup>
      <MsDeploySkipRules Include="SkipConfigFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipPhotosFolder">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Photos</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>filePath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Web\.config</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
      <MsDeploySkipRules Include="SkipWebConfig">
        <SkipAction>Delete</SkipAction>
        <ObjectName>dirPath</ObjectName>
        <AbsolutePath>$(_DestinationContentPath)\\Temp</AbsolutePath>
        <XPath>
        </XPath>
      </MsDeploySkipRules>
    </ItemGroup>
  </Target>

И, пожалуйста, не забудьте экранировать .правило пропуска в filePath с помощью обратной косой черты.

Брайан Огден
источник
11

Я боролся с той же проблемой и, наконец, нажал на спусковой крючок по преобразованию веб-сайта в веб-приложение. Как только я это сделал, я получил все преимущества IDE, такие как действие сборки, и он скомпилировался быстрее для загрузки (больше не нужно проверять веб-сайт ...).

Шаг 1. Преобразуйте свой «веб-сайт» в «веб-приложение». Чтобы преобразовать его, я просто создал новое «веб-приложение», удалил все файлы, которые оно создавало автоматически, и скопировал и вставил в него свой веб-сайт. Это сработало. Обратите внимание, что для файлов отчетов необходимо, чтобы действие сборки было установлено на «Содержимое» вместо «Нет».

Шаг 2: Теперь вы можете установить для любых файлов свойство «Build Action».

Надеюсь это поможет.

БлэкджекетМак
источник
7

В Visual Studio 2013 я обнаружил, что ответ Кита, добавив ExcludeFoldersFromDeploymentэлемент в файл проекта, не сработал (я не читал ответ Брайана Огдена, в котором говорится об этом). Однако я обнаружил, что могу исключить текстовый файл при публикации в Visual Studio 2013, просто установив следующие свойства в самом текстовом файле:

1) Действие сборки: нет

2) Копировать в выходной каталог: не копировать

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

Чтобы просмотреть эти свойства в графическом интерфейсе Visual Studio, в обозревателе решений щелкните правой кнопкой мыши файл, который нужно исключить, и выберите «Свойства» в контекстном меню.

Саймон Тевси
источник
Это работает при публикации Visual Studio 2015 в Azure.
Крис
2
Проблема заключается в том, что вам нужно исключить файлы только для определенных целевых сред (конфигурации сборки). Это больно.
benmccallum 01
5

Я думаю, у вас есть только два варианта:

  • Воспользуйтесь функцией «Исключить из проекта». Это не идеально, потому что элемент проекта будет исключен из любых операций интегрированного управления версиями IDE. Вам нужно будет нажать кнопку «Показать все файлы» в окне решения, если вам нужно увидеть файлы в обозревателе решений, но при этом также отображаются файлы и папки, которые вас не интересуют.
  • Используйте сценарий события после сборки, чтобы удалить все элементы проекта, которые не нужно публиковать (при условии, что вы публикуете в локальной папке, а затем загружаете на сервер).

Я проходил через это раньше и не мог придумать ничего действительно элегантного.

Кев
источник
2

Для Visual Studio 2017 : публикация WebApp , сначала создайте профиль публикации стандартной файловой системы. Перейдите в папку App_Data \ PublishProfiles \ и отредактируйте файл [имя профиля] .pubxml.

Добавить

<ExcludeFilesFromDeployment>[file1.ext];[file2.ext];[file(n).ext]</ExcludeFilesFromDeployment>

под тегом. <PropertyGroup> Этот тег можно указать только один раз, иначе он будет принимать только последние значения.

Пример:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <LaunchSiteAfterPublish>True</LaunchSiteAfterPublish>
    <ExcludeApp_Data>True</ExcludeApp_Data>
    <publishUrl>C:\inetput\mysite</publishUrl>
    <DeleteExistingFiles>False</DeleteExistingFiles>
    <ExcludeFilesFromDeployment>web.config;mysite.sln;App_Code\DevClass.cs;</ExcludeFilesFromDeployment>
  </PropertyGroup>
</Project>

Убедитесь, что для тега DeleteExistingFiles установлено значение False.

Нико Драйер
источник
Нико ты из GP? Работали в MCI?
Namphibian
1

Функция, которую вы ищете, существует, если ваш проект создан как «Веб-приложение». «Проекты» веб- сайта - это просто набор файлов, которые рассматриваются как 1: 1 с тем, что развертывается на веб-сервере.

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

Дэвид
источник
1

Это просто дополнение к другим полезным ответам здесь и кое-что, что я нашел полезным ...

Использование wpp.targets для исключенных файлов и папок

Когда у вас есть несколько развертываний для разных сред, полезно иметь только один общий файл, в котором вы можете установить все исключенные файлы и папки. Вы можете сделать это, создав *.wpp.targetsфайл в корне проекта, как в примере ниже.

Для получения дополнительной информации см. Это руководство Microsoft:

Как: изменить параметры развертывания в файлах профиля публикации (.pubxml) и файле .wpp.targets в веб-проектах Visual Studio

<?xml version="1.0" encoding="utf-8" ?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <EnableMSDeployAppOffline>True</EnableMSDeployAppOffline>
    <ExcludeFilesFromDeployment>
      *.config;
      *.targets;
      *.default;
    </ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>
      images;
      videos;
      uploads;
    </ExcludeFoldersFromDeployment>
  </PropertyGroup>
</Project>
Роберто
источник
0

В Visual Studio 2017 (в моем случае 15.9.3) манипуляции с файлом .csproj действительно работают отлично! Нет необходимости изменять pubxml.

Затем вы можете создать довольно приятные настройки в .csproj-файле, используя условие PropertyGroup, например:

  <PropertyGroup Condition="$(Configuration.StartsWith('Pub_'))">
    <ExcludeFoldersFromDeployment>Samples</ExcludeFoldersFromDeployment>
  </PropertyGroup>

исключает папку «Samples» из всех развертываний с конфигурациями, начинающимися с «Pub _» ...

Маркус Р.
источник
Я проверяю, что это работает для Visual Studio 2017 без применения свойства «Condition».
Erdem KAYA
0

В качестве современного ответа в Visual Studio 2017 с основным сайтом .net:

Вы можете исключить из публикации, например, в csproj, где CopyToPublishDirectory - никогда.

  <ItemGroup>
    <Content Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    </Content>
    <Content Update="appsettings.Local.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </Content>
  </ItemGroup>

Более подробно это обсуждается здесь: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/visual-studio-publish-profiles?view=aspnetcore-2.2

<PropertyGroup>
    <ExcludeFilesFromDeployment>appsettings.Local.json</ExcludeFilesFromDeployment>
</PropertyGroup>

Предыдущие предложения не сработали для меня, я предполагаю, потому что Visual Studio теперь использует другой механизм публикации внизу, я полагаю, с помощью инструмента cli «dotnet publish» или его эквивалента внизу.

Алекс КейСмит
источник