Виключити файли з веб-сайту, опублікованого у Visual Studio


79

Чи можу я виключити папку або файли, коли публікую веб-сайт у Visual Studio 2005? У мене є різні ресурси, які я хочу тримати під рукою в Провіднику рішень, наприклад, альтернативні файли конфігурації для різних середовищ, але я не хочу публікувати їх на сервері. Чи є спосіб їх виключити? При використанні інших типів проектів, таких як .dll-збірка, я можу встановити для властивості "Дія збірки" значення "Немає", а для властивості Копіювати у вихідний каталог "Не копіювати". Я не можу знайти подібних налаштувань для файлів на веб-сайті.

Якщо 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 під час публікації!
Michael Eakins

6
У проектах типу "Веб-сайт" цей фрагмент коду додається до файлів * .pubxml, розташованих у ~ / App_Data / PublishProfiles /.
Laylarenee

4
У веб-програмі ви можете додати ці елементи до PropertyGroup публікації вашого профілю @ ~ \ Properties \ PublishProfiles
ExecutionOrder

6
Чи можна це зробити за допомогою інтерфейсу користувача, а не редагувати файл проекту безпосередньо?
Куррен

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-deleteing-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 файлі. Не потрібно додавати новий елемент, якщо ви не введете певний тип збірки, наприклад, випуск або налагодження.

АЛЕ ЗАЧЕКАЙТЕ !!!

Якщо ви видаляєте файли з вашого цільового / цільового сервера з наступним параметром у вашій конфігурації публікації:

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

Потім процес Web Publish видалить на вашому вихідному / цільовому сервері все виключене, наприклад елемент, який ви окреслили у вашому <ExcludeFoldersFromDeployment>і <ExcludeFilesFromDeployment>!

Правила пропуску MsDeploy на допомогу:

По-перше, веб-публікація використовує щось інше, ніж 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>

І, будь ласка, не забудьте уникнути .правила пропуску у файлі path шляхом зворотної скісної риски.


11

Я боровся з тією ж проблемою і нарешті натиснув на спусковий механізм для перетворення веб-сайту на веб-додаток. Після того, як я це зробив, я отримав усі переваги IDE, такі як дія збірки, і вона швидше компілюється для завантаження (більше не перевіряється веб-сайт ...).

Крок 1: Перетворіть свій "веб-сайт" у "веб-додаток". Для його перетворення я просто створив нову "веб-програму", здув усі створені файли автоматично, скопіював і вставив мій веб-сайт. Це спрацювало нормально. Зверніть увагу, що для файлів звітів потрібно буде встановити для "Дії збірки" значення "Вміст" замість "жодного".

Крок 2: Тепер ви можете встановити будь-які властивості "Дія побудови" для будь-яких файлів.

Сподіваюся, це допомагає.


7

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

1) Дія побудови: Немає

2) Копіювати у вихідний каталог: Не копіювати

Спочатку я намагався встановити властивість "Копіювати у вихідний каталог" самостійно, але це не спрацювало, коли для Дії збірки було встановлено значення за замовчуванням "Вміст". Коли я тоді встановив Дію побудови на Ні, текстовий файл більше не копіювався в цільову папку, коли я публікував.

Щоб переглянути ці властивості в графічному інтерфейсі Visual Studio, у Провіднику рішень клацніть правою кнопкою миші файл, який потрібно виключити, та виберіть контекстне меню Властивості.


Це працює у виданні Visual Studio 2015 в Azure.
Кріс

2
Проблема полягає в тому, що вам потрібні файли, виключені лише для певних цільових середовищ (конфігурації збірки). Це боляче.
benmccallum

5

Я думаю, у вас тут є лише два варіанти:

  • Використовуйте функцію "Виключити з проекту". Це не ідеально, оскільки елемент проекту буде виключений з будь-яких інтегрованих операцій керування джерелом IDE. Вам потрібно буде натиснути кнопку «Показати всі файли» у вікні «Рішення», якщо вам потрібно переглянути файли в Провіднику рішень, але там також відображаються файли та папки, які вас не цікавлять.
  • Використовуйте сценарій події після збірки, щоб видалити будь-які елементи проекту, які ви не хочете публікувати (припускаючи, що ви публікуєте в локальній папці, а потім завантажуєте на сервер).

Я вже переживав це і не міг придумати нічого справді елегантного.


2

Для Visual Studio 2017 WebApp Publish , спочатку створіть стандартний профіль публікації файлової системи. Перейдіть до папки 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


Ніко ти з ГП? Працювали в MCI?
Намфібія

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>

виключає папку "Зразки" з усіх розгортань з конфігураціями, що починаються з "Pub _" ...


Я перевіряю, що це працює для Visual Studio 2017, не застосовуючи властивість "Умова".
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>

Раніше пропозиції не спрацювали для мене, я здогадуюсь, оскільки візуальна студія зараз використовує інший механізм публікації внизу, я припускаю за допомогою інструмента кліпу "dotnet публікація" або еквівалента внизу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.