Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 拥有sln文件,是否可以列出该sln下所有项目的所有文件?_.net_Build_Msbuild_.net Core_Dotnet Cli - Fatal编程技术网

.net 拥有sln文件,是否可以列出该sln下所有项目的所有文件?

.net 拥有sln文件,是否可以列出该sln下所有项目的所有文件?,.net,build,msbuild,.net-core,dotnet-cli,.net,Build,Msbuild,.net Core,Dotnet Cli,是否有一种方法或扩展可以实现以下功能: 拥有*.sln文件,我可以列出该sln下所有项目或所有解决方案文件夹中的所有文件吗 因此,如果我执行dotnetsln list,那么我将从该解决方案文件中获取项目列表,但我需要的是获取所有文件 我真正需要的是将所有这些文件复制到另一个文件夹。不确定这是否有帮助,但我相信Microsoft.Build.Evaluation可能会在这方面帮助您。还有一篇关于我认为你的问题的帖子: 我不知道你在做什么样的项目,我想是csproj。但即使事实并非如此,这或许会

是否有一种方法或扩展可以实现以下功能:

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

因此,如果我执行
dotnetsln list
,那么我将从该解决方案文件中获取项目列表,但我需要的是获取所有文件


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

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

我不知道你在做什么样的项目,我想是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 build
也适用于我,但可能不适用于旧版本,我不知道)

这将导入每个项目文件中的ListSources.Targets,并在编译后运行CopySourcesUsed目标。在编译之前,某个地方也会起作用,但接下来你必须弄清楚确切的时间:在编译之后,所有的项目都肯定已经收集好了。例如,AllSources项中填充了编译源文件和嵌入的资源。如您所见,编译项被过滤以排除生成的AssemblyAttributes/AssemblyInfo文件,因为您可能不需要这些文件。另一种方法可能是在添加这些文件之前运行此目标,但同样地,这更为棘手。您可能还需要复制其他内容(xaml/config/…),在这种情况下,您必须找出要包含的项的名称。首先检查csproj中是否没有简单列出。否则,使用诊断详细信息运行生成会告诉您名称:
dotnet msbuild mysolution.sln/v:diag


您可以在您拥有的每个项目中导入该文件,或者使用另一个扩展点,例如将其放在某个ImportAfter目录中,使其成为系统范围内的文件,而不是在命令行中注入此逻辑,所有这些解决方案都可以在此处找到。

使用类似Microsoft.Build.Evaluation的程序集,您可以加载项目文件并从中获取源文件(假设这是您想要的,您只需指定“文件”)。或者,如果不使用通配符来选择文件,则将项目文件解析为文本相当容易。有些文件是用通配符指定的。有些被排除在外。我需要csproj中包含的所有文件、源代码、资源和任何内容。我会探索那个api的。运气好吗?实际上,仔细想想:可能您甚至不需要直接使用api,但您可以从命令行使用msbuild.exe,并通过编写一个小目标来指示它将所有文件转储到文本文件中,然后将该目标导入到具有扩展点(如ImportAfter)的项目文件中。我没有时间写一个答案,但我相当肯定这会奏效。我还没有检查它。而且是。Net内核,所以格式有点不同。可能
dotnet build
实现已经找到了答案。请参见此处,了解编程解决方案:csproj。在一个文件夹中,我可以有两个解决方案,每个解决方案都有自己的CSPROJ列表。当VisualStudio构建sln时,它知道要查看哪些CSPROJ、要编译哪些文件、要将哪些文件放入输出文件夹(即复制到输出)或要嵌入DLL的文件。我想要实现的是(通过csprojs和/或解决方案文件夹)创建包含该sln的文件的干净副本。目前,我们有一个powershell脚本,该脚本解析sln,创建csprojs列表,然后复制相应的文件夹。但不是很容易维护。我意识到我没有正确表达这个问题。是的,这会将所有文件复制到目标文件夹,但不会保留相同的项目结构,不会复制csproj文件,也不会复制sln文件本身。复制操作的结果应该是可构建的(即dotnet build dest/target.sln应该与dotnet build src/target.sln一样工作)。保留结构只需添加一些路径操作(可能只是用dst替换src),复制csproj/sln并不难添加。但是考虑到您的实际需求:列出整个src目录并指定诸如bin/obj目录之类的排除项,然后复制它,不是更简单吗?或者,例如,如果您的项目处于源代码管理中,请使用它来获取要从中复制的文件?此外,您可能应该重新表述您的问题,以说明实际问题,而不是一种可能的方式,并可能提供一些有关目录结构的信息。虽然这不是一个完整的解决方案,但我会将其标记为已回答。如果我有时间写一个完整的解决方案,我会自己发布一个答案。如果你想,我可以修改代码,使其保留目录结构等?好的,请参阅编辑。复制.sln不在其中,因为在每次调用(即每个项目)时都复制它是没有意义的,而且如果要构建单个项目,甚至没有解决方案文件。我只是将其添加到一个批处理文件中,该批处理文件也会运行构建。
dotnet msbuild mysolution.sln /p:CustomAfterMicrosoftCSharpTargets=/path/to/CopySource.targets