有一个sln文件,可以列出该sln下所有项目的所有文件吗?

Adr*_*ode 5 .net msbuild build .net-core dotnet-cli

是否存在执行以下操作的方法或扩展:

有了一个*.sln文件,我可以列出所有项目中的所有文件或该sln下的所有解决方案文件夹吗?

所以,如果我这样做,dotnet sln list那么我从该解决方案文件中获取项目列表,但我需要的是获取所有文件.

我真正需要的是将所有这些文件复制到不同的文件夹中.

sti*_*ijn 2

这是一个基于 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>
Run Code Online (Sandbox Code Playgroud)

然后运行类似的构建

dotnet msbuild mysolution.sln /p:CustomAfterMicrosoftCSharpTargets=/path/to/CopySource.targets
Run Code Online (Sandbox Code Playgroud)

(注意dotnet build也适用于我,但可能不适用于旧版本,不知道)

这将在每个项目文件中导入 ListSources.Targets 并在编译后运行 CopySourcesUsed 目标。在编译之前,某个地方也可以工作,但是你必须弄清楚确切的时间:编译之后,所有项目肯定都已经收集完毕。例如,AllSources 项填充了编译源文件和嵌入资源。正如您所看到的,编译项被过滤以排除生成的 AssemblyAttributes/AssemblyInfo 文件,因为您可能不需要这些文件。另一种方法可能是在添加这些文件之前运行此目标,但同样:这更棘手。可能还需要复制其他内容(xaml/config/...),在这种情况下,您必须找出要包含的项目的名称。首先检查它是否没有简单地列在 csproj 中。否则,使用诊断详细信息运行构建可以告诉您名称:dotnet msbuild mysolution.sln /v:diag

您可以在每个项目中导入该文件,而不是在命令行上注入此逻辑,或者使用另一个扩展点,例如通过将其放入某个 ImportAfter 目录中来使其在系统范围内使用,所有这些解决方案都可以在此处找到。