Исключить файлы из веб-сайта, опубликовать в Visual Studio - PullRequest
72 голосов
/ 16 марта 2009

Можно ли исключить папку или файлы при публикации веб-сайта в Visual Studio 2005? У меня есть различные ресурсы, которые я хочу держать под рукой в ​​обозревателе решений, например альтернативные файлы конфигурации для различных сред, но я не хочу публиковать их на сервере. Есть ли способ их исключить? При использовании других типов проектов, таких как сборка .dll, я могу установить для свойства «Создать действие файла» значение «Нет», а для свойства «Копировать в выходной каталог» - «Не копировать». Я не могу найти похожие настройки для файлов на веб-сайте.

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

Ответы [ 10 ]

111 голосов
/ 14 июля 2013

Исключите папки и файлы, добавив элементы ExcludeFilesFromDeployment и ExcludeFoldersFromDeployment в файл проекта (.csproj, .vbproj и т. Д.). Добавьте их в любое место в соответствующем 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 находится в корне проекта)

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

32 голосов
/ 17 апреля 2015

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

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

  • Ответ с наивысшим рейтингом содержит статью 2010 года и говорит, что вам нужно отредактировать файл проекта csproj, который сейчас неверен. Я добавил XML-элемент ExcludeFoldersFromDeployment в мой файл Visual Studio 2012 csproj, и он ничего не сделал, элемент считался недействительным, потому что 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. Нет необходимости добавлять новый элемент, если вы не набираете конкретный тип сборки, например, release или debug.

НО ПОДОЖДИТЕ !!!

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

enter image description here

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

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

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

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

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

Теперь мои настоящие объявления 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>

И, пожалуйста, не забывайте экранировать . в правиле Пропуск файла с обратной косой чертой.

29 голосов
/ 16 марта 2009

Если вы можете идентифицировать файлы по расширению, вы можете настроить это, используя тег 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 в качестве типа.

11 голосов
/ 12 апреля 2011

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

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

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

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

6 голосов
/ 29 июля 2015

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

1) Действие построения: отсутствует

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

Изначально я пытался установить свойство Copy to Output Directory самостоятельно, но это не сработало, когда для параметра Build Action было установлено значение по умолчанию, Content. Когда я затем установил для параметра «Действие при построении» значение «Нет», текстовый файл больше не копировался в папку назначения при публикации.

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

5 голосов
/ 16 марта 2009

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

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

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

1 голос
/ 09 июня 2018

Для Visual Studio 2017, WebApp Publish , сначала создайте стандартный профиль публикации файловой системы. Перейдите в папку App_Data \ PublishProfiles \ и отредактируйте файл [profilename] .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

1 голос
/ 16 марта 2009

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

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

0 голосов
/ 28 января 2019

Как современный ответ, в 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 сейчас использует другой механизм публикации внизу, я полагаю, с помощью инструмента "dotnet publish" cli или аналога ниже.

0 голосов
/ 10 января 2019

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

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

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

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

...