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

时间:2018-12-14 13:13:03

标签: visual-studio f# msbuild project-structure

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

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

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

从PowerShell手动运行MSBuild时,它运行良好。但是,当我尝试在Visual Studio(v。2015)中打开项目时,出现以下错误消息:

  

无法打开F#项目。该项目使用   项目规范中的通配符。 F#项目中的通配符不是   当前受支持。

类似地,带有通配符的C#项目也可以正常工作。我想这与F#项目中文件的顺序很重要,如果用户想对文件重新排序使用通配符会引起问题。

但是,我想知道在我的特殊情况下是否可以做些什么:我不在乎VS中是否提供文件:我只是希望将它们复制到输出文件夹中。

2 个答案:

答案 0 :(得分:1)

  

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

实际上,Visual Studio 2017是一个不错的选择。我已经在Visual Studio 2015和2017中测试了**通配符,它​​在Visual Studio 2017中可以正常工作,但在Visual Studio 2015中却不能,出现与您相同的错误。

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

由于您并不关心文件是否在VS中可用,因此只希望将它们复制到输出文件夹,因此可以使用Power 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>

希望这会有所帮助。

答案 1 :(得分:1)

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

我怀疑您要执行的操作是将整个文件夹视为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可用作任务的参数。 Exclude用于排除文件。您也可以指定一个Condition属性,例如,仅针对发布或调试配置运行任务。 $(OutputPath)是可以在路径中使用的MSBuild properties之一。

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

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

这将包括Images目录中的所有文件,但Version2中的文件除外

使用构建后事件

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

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

$(ProjectDir)$(TargetDir)是替换宏,它们指向项目的文件夹和输出文件夹。 Pre-build Event/Post-build Event Command Line Dialog Box中提供了所有宏的列表。