在 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 "& { .\YourCopyFiles.ps1 } "" ></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.
中提供了所有宏的列表
我有一个 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 "& { .\YourCopyFiles.ps1 } "" ></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.