Як отримати функцію "Опублікувати" Visual Studio для включення файлів із події збірки?


90

На даний момент я намагаюся використовувати Visual Studio 2010 «Опублікувати» та функціональність MSDeploy, щоб задовольнити мої потреби у веб-розгортанні, але натрапив на блокпост щодо налаштування пакету залежно від моєї конфігурації збірки.

Я розробляю в 32-бітному середовищі, але мені потрібно створити пакет випуску для 64-бітного середовища, тому в конфігурації 'Release' я маю подію після збірки, яка копіює 64-бітну версію сторонньої DLL в каталог bin, перезаписуючи 32-бітну версію . Коли я використовую функцію "Опублікувати", навіть якщо правильна 64-бітна dll копіюється в каталог bin, вона не включається в пакет.

Чи є спосіб отримати "Опублікувати", щоб включити файли, які були скопійовані в каталог bin під час події після збірки?


1
Якщо замість цього ви використовуєте подію попередньої збірки, це, здається, працює, як ви вже хотіли (Visual Studio 2013, шаблон проекту ASP.NET).
bzlm

Здається, вони видалили попередньо побудовану поведінку, згадану у коментарі вище у Visual Studio 2015 та пізніших версіях.
justdan23

Відповіді:


92

Я відповів на подібне, але інше запитання на тему Як ви включаєте додаткові файли за допомогою веб-пакетів розгортання VS2010? .

У вашому сценарії ви використовуєте подію після збірки, я б рекомендував скинути подію збірки та реалізувати ваші дії, використовуючи власні цілі MSBuild замість події після збірки. Нижче ви знайдете текст іншої відповіді.


З: Як включати додаткові файли за допомогою веб-пакетів розгортання VS2010?


Чудове запитання. Я щойно опублікував дуже докладний запис у цьому блозі на Інструменті веб-розгортання (MSDeploy): Пакет побудови, включаючи додаткові файли або виключаючи конкретні файли .

Ось конспект. Після включення файлів я покажу, як виключити файли.

Включаючи додаткові файли

Включити додаткові файли до пакету трохи складніше, але все одно не потрібно, якщо вам зручно користуватися MSBuild, а якщо вам це не потрібно, прочитайте це. Для цього нам потрібно зачепити частину процесу, яка збирає файли для упаковки. Ціль, яку нам потрібно розширити, називається CopyAllFilesToSingleFolder. Ця ціль має властивість залежності PipelinePreDeployCopyAllFilesToOneFolderDependsOn, яку ми можемо використовувати і вводити власну ціль. Отже, ми створимо ціль з іменем CustomCollectFiles і введемо це в процес. Ми досягаємо цього за допомогою наступного (пам’ятаємо після імпорту).

<PropertyGroup>
  <CopyAllFilesToSingleFolderForPackageDependsOn>
    CustomCollectFiles;
    $(CopyAllFilesToSingleFolderForPackageDependsOn);
  </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>

Це додасть нашу ціль до процесу, тепер нам потрібно визначити саму ціль. Припустимо, у вас є папка з назвою Extra Files, яка знаходиться на 1 рівень над вашим веб-проектом. Ви хочете включити всі ці файли. Ось ціль CustomCollectFiles, і ми обговорюємо після цього.

<Target Name="CustomCollectFiles">
  <ItemGroup>
    <_CustomFiles Include="..\Extra Files\**\*" />

    <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
      <DestinationRelativePath>Extra Files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Target>

Тут я створив елемент _CustomFiles і в атрибуті Include сказав йому забрати всі файли в цій папці та будь-яку папку під ним. Потім я використовую цей елемент для заповнення елемента FilesForPackagingFromProject. Це елемент, який MSDeploy насправді використовує для додавання додаткових файлів. Також зверніть увагу, що я оголосив значення метаданих DestinationRelativePath. Це визначить відносний шлях, який він буде розміщений у пакунку. Тут я використав твердження Extra Files% (RecursiveDir)% (Filename)% (Extension). Це говорить про те, щоб розмістити його в тому самому відносному місці в пакунку, що і в папці Extra Files.

Виключаючи файли

Якщо ви відкриєте файл проекту веб-програми, створеної за допомогою VS 2010, внизу ви знайдете рядок з.

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

До речі, ви можете відкрити файл проекту всередині VS. Клацніть правою кнопкою миші на проекті виберіть Вивантажити проект. Потім клацніть правою кнопкою миші на незавантаженому проекті та виберіть Редагувати проект.

Це твердження включатиме всі цілі та завдання, які нам потрібні. Більшість наших налаштувань повинні бути після цього імпорту, якщо ви не впевнені, що якщо після! Отже, якщо у вас є файли для виключення, існує ім’я елемента, ExcludeFromPackageFiles, яке можна використовувати для цього. Наприклад, скажімо, у вас є файл з ім'ям Sample.Debug.js, який включений у вашу веб-програму, але ви хочете, щоб цей файл був виключений із створених пакетів. Ви можете розмістити фрагмент нижче після цього оператора імпорту.

<ItemGroup>
  <ExcludeFromPackageFiles Include="Sample.Debug.xml">
    <FromTarget>Project</FromTarget>
  </ExcludeFromPackageFiles>
</ItemGroup>

Оголосивши заповнення цього елемента, файли будуть автоматично виключені. Зверніть увагу на використання метаданих FromTarget тут. Я не буду вникати в це тут, але ви повинні знати, щоб це завжди вказувати.


8
@Sayed, здається, це не працює для VS2012, чи знаєте ви, як це можна оновити для цього сценарію. зміна на v11.0 не працює. ТІА.
Саймон Франческо

2
Буквально про це не існує документації. Документація Microsoft посилається на ваші блоги.
Метью Джеймс Девіс,

2
@Daniel Якщо вам потрібні лише певні файли, а не папка, просто змініть _CustomFiles, щоб включити ці конкретні файли, а не додавати рекурсивно за допомогою ***. Отже, щось на зразок <_CustomFiles Include = ".. \ Dependencies \ FileA.dll" /> <_ CustomFiles Include = "C: \ Someotherplace \ FileB.txt" /> Щось подібне до цього.
bwerks

3
@SimonFrancesco Я також зазнав це, і, здається, необхідною зміною було розширення <CopyAllFilesToSingleFolderForMsdeployDependsOn>, а не <CopyAllFilesToSingleFolderForPackageDependsOn>, як написано у відповіді вище.
bwerks


13

Я знайшов вирішення проблеми, використовуючи ExcludeFilesFromDeploymentелемент у файлі проекту. Я отримав ідею з веб-розгортання: виключаючи файли та папки

Отже, якщо вам потрібно упакувати файли проекту, оскільки вони існують у каталозі вашого проекту після успішної збірки та пов'язаних кроків після збірки, зробіть наступне.

  1. Відредагуйте налаштування проекту "Упаковка / Публікація в Інтернеті" та
    виберіть "Елементи для розгортання" як "Усі файли в цій папці проекту"
  2. Розвантажте проект
  3. Клацніть правою кнопкою миші на незавантаженому проекті та виберіть редагувати конфігурацію проекту
  4. Знайдіть PropertyGroupелемент, пов’язаний із налаштуванням конфігурації, наприклад, «Release»
  5. Всередині PropertyGroupелемента додайте наступні елементи та виключіть файли та папки, які ви не хочете в пакеті

    <ExcludeFilesFromDeployment>*.cs;**\.svn\**\*.*;Web.*.config;*.csproj*</ExcludeFilesFromDeployment>
    <ExcludeFoldersFromDeployment>.svn;Controllers;BootstrapperTasks;Properties</ExcludeFoldersFromDeployment>
    
  6. Збережіть і перезавантажте свій проект

Наразі це вирішує мою проблему, але якщо є краще рішення, будь ласка, дайте мені знати, оскільки це не ідеально через хакерство, але знову ж таки, можливо, це незвичний сценарій розгортання?


6

Виберіть файли або папки та змініть дію збірки як вміст у вікні властивостей.


1
Правильно, але додатково потрібно вибрати "Копіювати, якщо новіше" або "Копіювати завжди", оскільки в іншому випадку типовою дією є "Не копіювати", навіть якщо вибрано "Вміст".
Matt

1
домовтесь з Меттом про додатковий крок
Гомес

7
Дія збірки для папок не існує (VS2013)
Крістіан Е.

copytooutputdirectory = Копіювати завжди
Гомес

Працював навіть без копіювання Завжди.
Тенгіз,

3

Я знаю давнє запитання, але жодне з них не спрацювало для мене.

У 2017 році проти VS я просто клацнув по додатковій папці, яку потрібно опублікувати, і виберіть опублікувати, що це спрацювало.

Приклад:

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


Хоча це невеликий додатковий крок, він дуже простий.
Ciaran Gallagher

0

Додавання папки bin (та її вмісту) до проекту призвело до копіювання файлів у вихідний каталог публікації.

Для мене моя проблема полягала в тому, що мені потрібно було розмістити власний файл ліцензії на програмне забезпечення в папці bin /, але не хотів копіювати його вручну при кожному розгортанні.

Це використовувалось Visual Studio 2015 Professional


0

Я знаю, що це стара розмова, але я натрапив на неї, намагаючись зробити те саме, і вважав, що було б корисно додати те, що я знайшов тут.

Майже у всіх статтях про включення зайвих файлів у вашу публікацію використовується цей метод додавання елементів CopyAllFilesToSingleFolderForPackageDependsOnor CopyAllFilesToSingleFolderForMSDeployDependsOnу, PropertyGroupі всі вони мають щось на кшталт "Я додав це в кінець файлу ..."

Це те, що я зробив і провів півдня, намагаючись з’ясувати, чому нічого не відбувається, поки не зрозумів, що PropertyGroupу верхній частині файлу вже є розділ. Коли я помістив свій CopyAllFilesToSingleFolderForPackageDependsOnу цей розділ, він працював нормально.

Сподіваюся, це заощадить комусь час

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