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

时间:2018-10-26 06:39:23

标签: .net build msbuild .net-core dotnet-cli

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

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

因此,如果我执行dotnet sln list,则可以从该解决方案文件中获取项目列表,但是我需要获取所有文件。

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

2 个答案:

答案 0 :(得分: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>

然后运行类似的构建

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目录中,使其在系统范围内扩展,所有这些解决方案都可以在此处找到。大概是这样。

答案 1 :(得分:0)

不确定这是否有帮助,但我相信Microsoft.Build.Evaluation在这里可能会为您提供帮助。关于我认为您的问题还有另一篇文章:

csproj how to get all resources

我不知道您正在处理哪种项目,我假设使用csproj。但这可能会有所帮助,即使事实并非如此。您应该能够修改给定的示例,以便获得所需的所有文件。

旁注:了解我们正在讨论的项目类型,多少个项目以及是否存在排除的文件等信息可能会有所帮助。