有没有一种方法或扩展程序可以执行以下操作:
有一个*.sln
文件,我可以列出该sln下所有项目或所有解决方案文件夹中的所有文件吗?
因此,如果我执行dotnet sln list
,则可以从该解决方案文件中获取项目列表,但是我需要获取所有文件。
我真正的需要是将所有这些文件复制到另一个文件夹中。
答案 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。但这可能会有所帮助,即使事实并非如此。您应该能够修改给定的示例,以便获得所需的所有文件。
旁注:了解我们正在讨论的项目类型,多少个项目以及是否存在排除的文件等信息可能会有所帮助。