在 F# 项目中使用 ** 通配符导致 Visual Studio 拒绝加载项目

Using a ** wildcard in an F# project causes Visual Studio to refuse to load the project

我有一个 F# 项目,其中有几个附加文件存储在许多嵌套文件夹中,创建了一个复杂的文件夹结构。编译器不需要知道它们:我需要做的就是在构建过程结束时将它们复制到输出目录中。

我尝试使用 ** 通配符添加我的文件:

<ItemGroup>
    <FilesToCopyToOutput Include="additionalData\**\*.*"/>
</ItemGroup>

从 PowerShell 手动 运行 MSBuild 时工作正常。但是,当我尝试在 Visual Studio (v. 2015) 中打开我的项目时,我收到以下错误消息:

Cannot open F# project . This project uses wildcards in the item specification. Wildcards in F# projects are not currently supported.

同样,使用通配符的 C# 项目也能正常工作。我想这与 F# 项目中文件的顺序很重要这一事实有关,如果用户想要重新排序文件,使用通配符会导致问题。

但是,我想知道在我的特定情况下是否可以做任何事情:我不关心这些文件是否在 VS 中可用:我只是希望将它们复制到输出文件夹。

Using a ** wildcard in an F# project causes Visual Studio to refuse to load the project

的确,Visual Studio2017年是个不错的选择。我已经在 Visual Studio 2015 和 2017 中测试了 ** 通配符,它​​在 Visual Studio 2017 中运行良好,但在 Visual Studio 2015 中运行良好,出现了与您相同的错误。

由于您无法更改技术堆栈以使用 Visual Studio 2017,我想提供一个解决此问题的方法,您可以检查它是否适合您。

因为你不关心文件在VS中是否可用,你只想将它们复制到输出文件夹,你可以使用强大的shell脚本来复制additionalData 文件夹到输出文件夹,如:

Copy-Item -Path "ThePathForAdditionalData\additionalData" -Destination "ThePathForProject\bin\Debug" -recurse -Force

然后在构建后使用 MSBuild 任务执行此 power shell 脚本:

<Target Name="CopyMyFiles" AfterTargets="Build">
  <Message Text="Copying files..."/>
  <Exec Command="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -executionpolicy Unrestricted -command &quot;&amp; { .\YourCopyFiles.ps1 } &quot;" ></Exec>
</Target>

希望对您有所帮助。

我假设 FilesToCopyToOutput 是您为项目集合指定的名称,问题是如何阻止旧的 F# 编译器认为它应该处理它?

我怀疑你想做的是将整个文件夹视为 content 项目并将它们复制到输出文件夹:

<Content Include="additionalData\**\*.*">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>

复制任务

如果要使用 MSBuild 任务复制项目,可以使用 Copy。你应该能够写:

<ItemGroup>
    <MyAdditionalData Include="additionalData\**\*.*" />
</ItemGroup>

<Target Name="CopyFiles">  
    <Copy  
        SourceFiles="@(MyAdditionalData)"  
        DestinationFolder="$(OutputPath)"  
    />  
</Target>  

可在路径中使用的Include属性allows selecting multiple files that can be used as arguments to a task. Exclude is used to exclude files. You can specify a Condition attribute too, eg to run the task only for Release or Debug configuration. $(OutputPath) is one of the MSBuild properties

How to: Exclude Files from the Build 展示了如何组合所有这些属性来处理目录中的特定项目,例如:

<JPGFile  
    Include="Images\**\*.jpg"  
    Exclude = "Images\**\Version2\*.jpg"/>  

这将包括 Images 目录中除 Version2

中的所有文件

使用 Post-构建事件

尽管大多数人没有使用 MSBuild 直到最新的简化格式。 构建后复制文件的最常见方法是使用项目 属性 页面中的 post-build event,例如:

xcopy $(ProjectDir)additionalData\*.* $(TargetDir) /s /e 

$(ProjectDir)$(TargetDir) 是指向项目文件夹和输出文件夹的替换宏。 Pre-build Event/Post-build Event Command Line Dialog Box.

中提供了所有宏的列表