使用通配符加载包含项的.NET项目

3

我发现在我的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>

一些注释:

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

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

project.GetItems "MyGroup"

我只得到了一个项目,那就是“Test.txt”。其他文件不会被发现,除非我在fsproj中明确地定义它们(即不使用通配符)。
有没有办法让我也能使用通配符来发现包含的文件?我甚至可以接受以未解决的形式获取它们。所以获取“TestFiles\ ** \ *”而不是匹配模式的特定文件也可以。
1个回答

1

找到了解决方案。

首先,我要说的是问题出在我的一面。事实上,通常情况下,当您尝试加载项目时,它确实会加载所有文件。即使是使用通配符定义的文件,只要符合模式。

这就是问题所在:在我的应用程序中,我不使用简单的collection.LoadProject,而是使用一个更复杂的库。是的 - 该库会执行一些魔术操作,导致了问题。

在这种情况下,问题很简单:所有* .[cs | fs] proj文件都被复制到C:\ temp \<random_folder_name>。只有* .[cs | fs] proj文件 - 没有更少,没有更多。因此,当项目加载器尝试评估解决方案时,根本没有文件可以进行模式匹配,导致元素为零。

这里的教训是:编写适当的MCVE很重要 - 可以节省我(也可能是您)一些时间。对于问题,向大家道歉!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接