有一个 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 目录使其在系统范围内使用,所有这些解决方案都可以找到大概就在这里。
有没有一种方法或扩展可以执行以下操作:
有一个 *.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 目录使其在系统范围内使用,所有这些解决方案都可以找到大概就在这里。