【问题标题】:Loading a .NET project with items included as wildcards加载包含作为通配符的项目的 .NET 项目
【发布时间】:2019-01-10 17:35:30
【问题描述】:

我发现,在我的 C#/F# 代码中,我可以使用任何 .NET 项目加载信息

collection.LoadProject(path_to_my_proj_file)

其中collection 的类型为ProjectCollection。然后我可以访问项目中定义的所有属性和项及其所有依赖项。例如,我可以通过以下方式访问通过Compile 包含的所有文件

project.GetItems "Compile"

假设我想在我的 fsproj 文件中定义一个自定义 ItemGroup:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 ...
  <ItemGroup>
    <MyGroup Include="Test.txt" />
    <MyGroup Include="TestFiles\**\*" />
  </ItemGroup>
</Project>

一些cmets:

  • MyGroup 是我的自定义集合标识符。我发现这样的事情是允许的
  • “TestFiles”文件夹包含 4 个文件,它们都存在于某些子文件夹中,但它们都与“TestFiles\**\*”模式匹配

当我使用开头提到的方法加载项目并运行时

project.GetItems "MyGroup"

我只得到一项,即“Test.txt”。除非我在 fsproj 中明确定义(即没有通配符),否则不会发现其他文件。

有没有办法让我发现使用通配符包含的文件?我什至很高兴让它们以未解决的形式出现。所以获取“TestFiles\**\*”而不是匹配模式的特定文件也很好。

【问题讨论】:

    标签: c# .net f# msbuild msbuild-api


    【解决方案1】:

    找到了解决办法。

    首先,让我说问题出在我这边。实际上,通常当您尝试加载项目时,它也会加载所有文件。即使是那些用通配符定义的,只要 ofc 匹配模式。

    这就是交易:在我的应用程序中,我不使用普通的collection.LoadProject,而是使用更复杂的库。是的 - 图书馆做了一些导致问题的神奇东西。

    在这种情况下,问题很简单:所有 *.[cs|fs]proj 文件都被复制到 C:\temp\&lt;random_folder_name&gt;。只有 *.[cs|fs]proj 文件 - 仅此而已。结果,当项目加载器尝试评估解决方案时,根本没有要进行模式匹配的文件,从而导致零元素。

    这里的教训是:编写正确的 MCVE 很重要 - 可以节省我(可能还有你)一些时间。各位大佬,有问题请见谅!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 2015-02-23
      • 2017-09-07
      相关资源
      最近更新 更多