Имея файл sln, можно ли перечислить все файлы из всех проектов под этим sln?

Есть ли способ или расширение, которое делает следующее:

Имея файл *.sln, могу ли я перечислить все файлы из всех проектов или всех папок решений в этом sln?

Итак, если я использую dotnet sln list, я получаю список проектов из этого файла решения, но мне нужно получить все файлы.

Мне действительно нужно скопировать все эти файлы в другую папку.

Используя такие сборки, как Microsoft.Build.Evaluation, вы можете загрузить файл проекта и получить из него исходные файлы (если это то, что вы хотите, вы просто указываете «файлы»?). Или, если вы не используете подстановочные знаки для выбора файлов, разобрать файл проекта по тексту довольно просто.

stijn 28.10.2018 08:29

Некоторые указаны с использованием подстановочных знаков. Некоторые исключены. Мне нужны все файлы, исходный код, ресурсы, все, что есть в csproj. Я исследую этот api.

Adrian Iftode 28.10.2018 18:19

При удаче? Собственно, если подумать: вероятно, вам даже не нужно напрямую использовать api, но вы можете использовать msbuild.exe из командной строки и указать ему выгрузить все файлы в текстовый файл или около того, написав небольшую цель, которая делает это а затем импортируйте эту цель в файлы проекта с точкой расширения, такой как ImportAfter. У банкомата нет времени написать ответ, но я почти уверен, что это поможет.

stijn 29.10.2018 21:50

Еще не проверял. Также это. Чистое ядро, поэтому формат немного другой. Возможно, ответ есть у реализации dotnet build.

Adrian Iftode 29.10.2018 21:53

См. Здесь для программного решения: stackoverflow.com/questions/53070977/…

stijn 31.10.2018 15:16
6
5
1 947
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не уверен, что это может помочь, но я верю, что Microsoft.Build.Evaluation может вам здесь помочь. Есть еще один пост о том, что я считаю вашей проблемой:

csproj как получить все ресурсы

Я не знаю, с какими проектами вы работаете, я бы предположил, что csproj. Но, возможно, это поможет, даже если это не так. У вас должна быть возможность изменить данный пример, чтобы получить все необходимые файлы.

Боковое примечание: вероятно, было бы полезно получить немного больше информации о том, о каких проектах мы говорим, сколько и есть ли исключенные файлы и т. д.

csproj. В папке у меня могло быть два решения, каждое со своим списком csprojs. Когда Visual Studio создает sln, она знает, в какие csprojs нужно смотреть, какие файлы компилировать, какие файлы помещать в папки вывода (т. Е. Копировать для вывода) или какие файлы вставлять dll. Я хочу сделать чистую копию файлов, включенных в этот sln (через csprojs и / или папки решений).

Adrian Iftode 30.10.2018 21:34

В настоящее время у нас есть сценарий PowerShell, который анализирует sln, создает список csprojs, а затем копирует соответствующие папки. Но не очень ремонтопригоден.

Adrian Iftode 30.10.2018 21:35
Ответ принят как подходящий

Вот решение на основе msbuild, которое на самом деле довольно простое и ненавязчивое. Создайте файл CopySource.targets в каталоге решения, например, с содержимым:

<Project>
  <Target Name="CopySourcesUsed" AfterTargets="AfterCompile">
    <PropertyGroup>
      <DestinationDirectory>c:\temp\dest\</DestinationDirectory>
      <SourceDirectory>$([System.IO.Path]::GetDirectoryName($(MSBuildProjectDirectory)))</SourceDirectory>
    </PropertyGroup>
    <ItemGroup>
      <CompileSources Condition="!$([System.Text.RegularExpressions.Regex]::IsMatch('%(Identity)', `.*Assembly(Attributes|Info)\.cs`))" Include="@(Compile)"/>
      <AllSources Include="@(CompileSources);@(EmbeddedResource);$(MSBuildProjectFile)" />
      <AllSources>
        <Dest>$([System.String]::new('%(FullPath)').Replace($(SourceDirectory), $(DestinationDirectory)))</Dest>
      </AllSources>
    </ItemGroup>
    <Message Importance="High" Text="%(AllSources.FullPath) -> %(AllSources.Dest)"/>
    <Copy SourceFiles="@(AllSources)" DestinationFiles="@(AllSources->'%(Dest)')" />
  </Target>
</Project>

Затем запустите сборку, например

dotnet msbuild mysolution.sln /p:CustomAfterMicrosoftCSharpTargets=/path/to/CopySource.targets

(обратите внимание, что dotnet build также работает у меня, но может не работать в более старых версиях, не знаю)

Это импортирует ListSources.Targets в каждый файл проекта и запустит цель CopySourcesUsed после компиляции. Перед компиляцией где-то тоже сработает, но тогда вам нужно точно выяснить, когда: после компиляции все элементы определенно собраны. Например, элемент AllSources заполнен исходными файлами компиляции и встроенными ресурсами. Как видите, элемент Compile фильтруется, чтобы исключить сгенерированные файлы AssemblyAttributes / AssemblyInfo, поскольку они вам, вероятно, не нужны. Альтернативой может быть запуск этой цели до того, как эти файлы будут добавлены, но опять же: это еще сложнее. Могут быть и другие вещи, которые вы хотите скопировать (xaml / config / ...), и в этом случае вам нужно выяснить имя элемента, который нужно включить. Сначала проверьте, не указан ли он просто в файле csproj. Иначе, запустив сборку с диагностической подробностью, вы сможете узнать имя: dotnet msbuild mysolution.sln /v:diag.

Вместо того, чтобы вводить эту логику в командную строку, вы могли бы вместо этого импортировать файл в каждый имеющийся у вас проект или использовать другую точку расширения, например сделать его общесистемным, поместив его в какой-то каталог ImportAfter, все эти решения, вероятно, можно найти здесь, на SO.

Я понимаю, что неправильно сформулировал вопрос. Да, это копирует все файлы в папку назначения, но не сохраняет ту же структуру проектов, не копирует файлы csproj и не копирует сам файл sln. Результатом операции копирования должен быть build-able (т.е. сборка dotnet dest / target.sln должна работать как сборка dotnet src / target.sln)

Adrian Iftode 31.10.2018 19:26

Сохранение структуры - это вопрос добавления некоторых манипуляций с путями (возможно, просто замените src на dst), а копирование csproj / sln добавить не сложно. Но, учитывая ваше фактическое требование: не проще ли перечислить весь каталог src и указать исключения, такие как каталоги bin / obj, а затем скопировать это? Или, например, если у вас есть проект в системе управления версиями, использовать это, чтобы получить файлы для копирования? Также вам, вероятно, следует перефразировать свой вопрос, чтобы указать фактический вопрос, а не возможный способ сделать это, и, возможно, предоставить некоторую информацию о структуре вашего каталога.

stijn 31.10.2018 20:14

Хотя это не полное решение, я отмечу его как ответ. Я сам отправлю ответ, если у меня будет время написать полное решение.

Adrian Iftode 05.11.2018 07:17

Если хотите, я могу изменить код, чтобы он сохранил структуру каталогов и т. д.?

stijn 05.11.2018 10:11

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

Adrian Iftode 05.11.2018 12:01

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

stijn 05.11.2018 13:25

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