Использование подстановочного знака ** в проекте F # приводит к тому, что Visual Studio отказывается загружать проект - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть проект F # с несколькими дополнительными файлами, которые хранятся во многих вложенных папках, создавая сложную структуру папок.Компилятору не нужно знать о них: все, что мне нужно, это скопировать их в выходной каталог в конце процесса сборки.

Я попытался добавить свои файлы, используя подстановочный знак **:

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

Отлично работает при запуске MSBuild вручную из PowerShell.Однако, когда я пытаюсь открыть свой проект в Visual Studio (v. 2015), я получаю следующее сообщение об ошибке:

Не удается открыть проект F #.Этот проект использует подстановочные знаки в спецификации элемента.Подстановочные знаки в проектах F # в настоящее время не поддерживаются.

Аналогично, проект C # с подстановочными знаками работает просто отлично.Я предполагаю, что это как-то связано с тем, что порядок файлов в проекте F # имеет значение, и использование подстановочных знаков вызывает проблему, если пользователь хочет изменить порядок файлов.

Однако мне интересно, можно ли что-нибудь сделать в моем конкретном случае: мне все равно, доступны ли файлы в VS или нет: я просто хочу, чтобы они были скопированы в выходную папку.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Полагаю, FilesToCopyToOutput - это имя, которое вы дали коллекции элементов, и вопрос в том, как помешать старому компилятору F # думать, что он с этим справится?

Я подозреваю, что вы хотите сделать, хотяобрабатывать всю папку как содержимое элементов и копировать их в выходную папку:

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

Копировать задачу

Если вы хотитекопировать элементы с помощью задачи MSBuild, которую вы можете использовать Копировать .Вы должны иметь возможность написать:

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

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

Атрибут Include позволяет выбрать несколько файлов , которые можно использовать в качестве аргументов для задачи.Exclude используется для исключения файлов.Вы также можете указать атрибут Condition, например, чтобы запускать задачу только для конфигурации Release или Debug.$(OutputPath) - это одно из свойств MSBuild , которое можно использовать в путях.

Как: исключать файлы из сборки показывает, как можно объединить все эти атрибутыдля обработки определенных элементов в каталоге, например:

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

Это будет включать все файлы в каталоге Images, за исключением файлов в Version2

Использование событий после сборки

Большинство людей, хотя не не использовали MSBuild до последнего упрощенного формата.Наиболее распространенный способ копирования файлов после сборки - это использование события после сборки со страниц свойств проекта, например:

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

$(ProjectDir) и $(TargetDir) являются заменяющими макросамиэто указывает на папку проектов и выходную папку.Список всех макросов доступен в Диалоговое окно командной строки события до / после сборки .

0 голосов
/ 17 декабря 2018

Использование подстановочного знака ** в проекте 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

Затем выполните этот скрипт Power Shell с задачей MSBuildпосле сборки:

<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>

Надеюсь, это поможет.

...