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

Having a sln file, possible to list all files from all projects under that sln?

有没有一种方法或扩展可以执行以下操作:

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

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

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

不确定这是否有帮助,但我相信 Microsoft.Build.Evaluation 可能会对您有所帮助。还有一个post关于我认为是你的问题:

csproj how to get all resources

我不知道你在做什么项目,我假设是 csproj。但也许这会有所帮助,即使事实并非如此。您应该能够修改给定的示例,以便获得所需的所有文件。

旁注:关于我们正在谈论的项目类型、数量以及是否有排除文件等的更多信息可能会有所帮助。

这是一个基于 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 目录使其在系统范围内使用,所有这些解决方案都可以找到大概就在这里。