Visual studio 2017 Исключить папки из развертывания, но включить некоторые подпапки

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

/Folder1/
/Folder1/FileX
/Folder1/FileY
/Folder1/SubFolder1/
/Folder1/SubFolder2/

Что я хочу, это исключить весь контент Folder1, но включить только определенный набор подпапок (в моем примере SubFolder1).

Папка Folder1 исключается с помощью ExcludeFoldersFromDeployment в.pubxml:

<ExcludeFoldersFromDeployment>Folder1</ExcludeFoldersFromDeployment>

2 ответа

Вы не сказали нам, что это за файл.pubxml, поэтому есть предел тому, с чем мы можем вам помочь.

А вообще:

Конструкция, которая работает с файлами и папками в MSBuild - это Items. Вы хотите элемент здесь, а не свойство MSBuild.

Таким образом, вы можете легко использовать элемент для указания на конкретную подпапку в вашей среде сборки, например:

<ItemGroup>
  <!-- This will grab all files in SubFolder1 but not recursively -->
  <DeployThese Include="/Folder1/SubFolder1/*.*" />
</ItemGroup>

Затем вы можете делать все, что вы хотите с этим элементом. Вы можете скопировать файлы в другое место или что-нибудь еще с ними.

Файлы доступны позже с помощью @(DeployThese)

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

Да, это возможно.

Примечание: один момент, который мы должны знать, поскольку вы использовали элемент "ExcludeFoldersFromDeployment" в.pubxml, чтобы исключить весь каталог Folder1. Некоторые действия по развертыванию в файле.xxproj могут быть перезаписаны или затронуты им.

Итак, для достижения вашей цели нам нужно выполнить два шага: 1. Скопировать вложенную папку в новую папку (новая папка в $(ProjectDir) может быть лучше) 2. Добавить содержимое вложенной папки для публикации и выбрать структуру, которую вы хочу

Вот обходной путь:

1: добавьте предварительную версию PreBuildEvent в файл.csproj.

  <PropertyGroup>
    <PreBuildEvent>xcopy "$(ProjectDir)/Folder1/SubFolder1" "$(ProjectDir)/NewFolder" /E /Y /I</PreBuildEvent>
  </PropertyGroup>

2: Добавьте следующую разметку в файл.csproj, это поможет опубликовать дополнительные файлы для публикации папки в Asp.net:

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

  <Target Name="CustomCollectFiles">
    <ItemGroup>
      <_CustomFiles Include="NewFolder\**\*" />
      <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>MyStructureUnderPublishFolder\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>

Для этой разметки нам нужно всего лишь изменить два пути для удовлетворения наших потребностей.

Во-первых: CustomFiles относится к папке, содержимое которой будет опубликовано.

Второе: MyStructureUnderPublishFolder ссылается на структуру, которую вы хотите разместить в папке публикации. Если вы хотите, чтобы папка Folder1 имела только вложенную папку после развертывания, измените ее на Folder1/SubFolder1 или измените ее на SubFolder1, если вам нужна простая подпапка1 в папке Publish.

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

Другие вопросы по тегам