2015-11-07 2 views
1

Я пытаюсь запустить демонстрационный код для suave (веб-сервера) в Xamarin Studio 5.9.8 на OS X El Capitan.F # Interactive, NuGet и внешние библиотеки

module ServerTest = 
    open Suave     // always open suave 
    open Suave.Http.Successful // for OK-result 
    open Suave.Web    // for config 

    startWebServer defaultConfig (OK "Hello World!") 

Он работает, как ожидается, когда я действительно создаю код. Но когда я пытаюсь запустить его в интерактивном режиме, ctrl + return, я получаю ошибку The namespace or module 'Suave' is not defined. Я огляделся, и это выглядит like it's possible to use libraries interactively with Visual Studio. Есть ли способ заставить это работать на OS X?

+1

Вы пытались использовать ту же директиву '# r'? –

+0

У меня нет. Имеют ли директивы только файлы * .fsx? Xamarin даже не позволяет мне вводить '# r' внутри модуля. – wegry

+1

Эти директивы работают либо в файлах * .fsx, либо в FSI (независимо от того, как вы с ним взаимодействуете), это то, что выполняет * .fsx-файлы, поэтому это должно иметь смысл. Страница, к которой вы привязаны, относится к * .fsx и FSI, а не к Visual Studio. Просто случается использовать VS в качестве демонстрационного автомобиля. –

ответ

3

Когда вы создаете свой код, информация о связанных DLL-файлах содержится не в самом коде, а в другом месте (файл проекта). Но когда вы выполняете код в FSI, все FSI видит код. У него нет файла проекта, из которого можно получить ссылки.

Но так как FSI по-прежнему нужно загружать связанные DLL-файлы изредка (в противном случае это было бы не очень полезно), он предлагает способ их кодирования в коде. Этот способ описан in the page you linked - в частности, #r.

К сожалению, эти директивы не поддерживаются при создании кода с помощью компилятора. Компилятор будет генерировать ошибку, когда увидит их.

Итак, у вас есть выбор: либо выполнить код с помощью FSI, либо построить его с помощью компилятора. Нельзя использовать тот же код для обоих.

К счастью, есть несколько уловок, чтобы обойти это.

Первый, вы могли бы использовать специальную переменную условной компиляции под названием INTERACTIVE и поставить #r директиву внутри #if, так что только FSI будет видеть его, но компилятор не будет:

#if INTERACTIVE 
    #r "./path/to/my.dll" 
#endif 

Второй , вы можете создать отдельный файл сценария, который будет загружать ссылки, а затем загружать фактический файл кода:

#r "./path/to/my.dll" 
#load "./my_code.fs" 

Затем выполните этот файл сценария с помощью FSI.

В обоих случаях пути относятся к файлу сценария.
Это означает, что ошибка «не найден», которую вы получаете, вероятно, связана с неправильным путём к Suave DLL. Я серьезно сомневаюсь, что DLL находится в том же каталоге с файлом кода. А также, что он не имеет расширения.

+0

Мой путь был #r './../ packages/Suave.0.32.1/lib/net40/Suave.dll', который, похоже, был бы очень хрупким в в зависимости от того, насколько часто обновляемая библиотека обновляется. – wegry

+1

Вот почему вы не должны делать ничего сложного в сценариях. Для сложных вещей создайте код и запустите исполняемый файл. Скрипты лучше всего зарезервированы для экспериментов или облегченных задач, которые часто меняются, поэтому при каждом изменении относительно дорого перестраивать. –

+1

Кроме того, если вы настаиваете на том, чтобы запускать его как скрипт, вам, вероятно, не следует использовать структуру каталогов, предназначенную для построения. Все это хлопот с размещением пакетов в специальных местах, помеченных версией и каркасом, - это все, чтобы облегчить сборку. Если ваше решение основано на сценарии, вам лучше оставить ссылки рядом со сценарием. В конце концов, как файл * .exe будет работать в любом случае. –

Смежные вопросы