我有一个F#项目,其中几个其他文件存储在许多嵌套文件夹中,从而创建了一个复杂的文件夹结构。编译器不需要了解它们:我要做的就是在构建过程结束时将它们复制到输出目录中。
我尝试使用**通配符添加文件:
<ItemGroup>
<FilesToCopyToOutput Include="additionalData\**\*.*"/>
</ItemGroup>
从PowerShell手动运行MSBuild时,它运行良好。但是,当我尝试在Visual Studio(v。2015)中打开项目时,出现以下错误消息:
无法打开F#项目。该项目使用 项目规范中的通配符。 F#项目中的通配符不是 当前受支持。
类似地,带有通配符的C#项目也可以正常工作。我想这与F#项目中文件的顺序很重要,如果用户想对文件重新排序使用通配符会引起问题。
但是,我想知道在我的特殊情况下是否可以做些什么:我不在乎VS中是否提供文件:我只是希望将它们复制到输出文件夹中。
答案 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 "& { .\YourCopyFiles.ps1 } "" ></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中提供了所有宏的列表。