如果有一个sln文件,是否可以列出该sln下所有项目的所有文件



有没有一种方法或扩展可以做到以下几点:

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

所以,如果我执行dotnet sln list,那么我会从该解决方案文件中获得项目列表,但我需要的是获得所有文件。

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

这里有一个基于msbuild的解决方案,它实际上相当简单,也不具有侵入性。在解决方案目录中创建一个文件CopySource.targets,例如contents:

<Project>
<Target Name="CopySourcesUsed" AfterTargets="AfterCompile">
<PropertyGroup>
<DestinationDirectory>c:tempdest</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上找到。

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

csproj如何获得所有资源

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

附带说明:如果能有更多关于我们正在谈论的项目类型、数量以及是否有排除文件等的信息,那可能会很好。

最新更新