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.
Подробнее о добавлении дополнительных файлов для публикации смотрите здесь.