Как собрать и запустить компилятор fable из исходного кода?

Я пытаюсь использовать fable powerpack в проекте шаблона fable elmish. Во время компиляции появляется предупреждение:

 warning FABLE: Nested option in option won't work at runtime 

Скомпилированный код (использующий тестовый код fable) также не работает.

Код:

let openCursor(index: Browser.IDBIndex, keyCursor: bool, range: Browser.IDBKeyRange option, direction: DBCursorDirection option, step: uint32 option) =
    let range = defaultArg range Unchecked.defaultof<Browser.IDBKeyRange>
    let direction = (defaultArg direction DBCursorDirection.Default).ToString()
    let step = defaultArg step 1u
    let request =
        match keyCursor with
        | false -> index.openCursor(range, direction) //warning here
        | true -> index.openKeyCursor(range, direction)//warning here

Переводится на:

    function openCursor(index, keyCursor, range, direction, step) {
        var range_1 = range != null ? range : null;
        var direction_1 = Object(__WEBPACK_IMPORTED_MODULE_3__nuget_packages_fable_core_1_2_4_fable_core_Util__["y"/* toString */
        ])(direction != null ? direction : DBCursorDirection.Default);
        var step_1 = step != null ? step : 1;
        var request = keyCursor ? index.openKeyCursor(Object(__WEBPACK_IMPORTED_MODULE_3__nuget_packages_fable_core_1_2_4_fable_core_Util__["x"/* some */
        ])(range_1), direction_1) : index.openCursor(Object(__WEBPACK_IMPORTED_MODULE_3__nuget_packages_fable_core_1_2_4_fable_core_Util__["x"/* some */
        ])(range_1), direction_1);

range_1 - ноль, нет проблем, но

Object(__WEBPACK_IMPORTED_MODULE_3__nuget_packages_fable_core_1_2_4_fable_core_Util__["x"/* some */])(null) 

возвращает {} вместо undefined, если он возвращает undefined (или null?), тогда проблем не будет

Клонировал проект powerpack, и это работает, openCursor переводится на:

function openCursor(index, keyCursor, range, direction, step) {
  var range_1 = range != null ? range : null;
  var direction_1 = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_2_0_beta_003_fable_core_Util__["f" /* toString */])(direction != null ? direction : DBCursorDirection.Default);
  var step_1 = step != null ? step : 1;
  var request = keyCursor ? index.openKeyCursor(range_1, direction_1) : index.openCursor(range_1, direction_1);

Я видел, что он использует другую dotnet-басню (1.2.4 из шаблона fable elmish), поэтому изменил paket.lock на downgrade (1.2.0-beta-005 из fable-powerpack) и выполнил восстановление dotnet.

Теперь он вообще не будет компилироваться с ошибкой (возможно, fable реагировать не может с версиями fable, используемыми powerpack):

ОШИБКА в /home/harm/.nuget/packages/fable.react/1.2.1/fable/Fable.Helpers.React.fs /home/harm/.nuget/packages/fable.react/1.2.1/fable/Fable.Helpers.React.fs(588,53): (588,62) ​​ошибка FSHARP: тип 'ParamList' не определен. @./src/App.fs 5: 0-107 @./src/sale.fsproj @ multi (webpack) -dev-server / client? http://localhost:8080/ webpack/hot/dev-server ./src/sale.fsproj

Клонировал компилятор Fable и собрал его (не генерирует пакет nuget, но некоторые папки с бинарными файлами).

В басне powerpack связан со сборкой:

ln -s ../Fable/build/fable ./fable

Затем попытался собрать блок питания indexeddb (изменил тесты /Main.fs и Tests.fsproj, чтобы использовать Program.fs indexeddb)

dotnet ./fable/dotnet-fable.dll yarn-run pretest

Конечно же, это тоже не работает:

ОШИБКА в./src/IndexedDB.fs Модуль не найден: Ошибка: не удается разрешить '../../../.nuget/packages/fable.core/1.2.0-beta-003/fable-core/ Опция ' in '/home/mage /dev/fable-powerpack/src' @ ./src/IndexedDB.fs 9:0-102 @ ./tests/Program.fs @ ./tests/Main.fs @ ./tests/Tests.fsproj

ОШИБКА в./src/PromiseSeq/Module.fs Модуль не найден: Ошибка: не удается разрешить '../../../../.nuget/packages/fable.core/1.2.0-beta-003/fable-core/ Опция ' in '/home/ вред /dev/fable-powerpack/src/PromiseSeq' @ ./src/PromiseSeq/Module.fs 10:0-99 @ ./src/PromiseSeq/Extensions.fs @ ./tests/Program.fs @ ./tests/Main.fs @ ./tests/Tests.fsproj

Каталог ~/.nuget/packages/fable.core/1.2.0-beta-003/fable-core/ существует, но я предполагаю, что относительный путь неверен. Кроме того, откуда он берет 1.2.0, ядро ​​fable из сборки Fable - это версия 1.3.0-beta-002 так что, хотя я использую версию dotnet-басни 1.3.0-beta-002 по некоторым причинам он не использует ядро ​​басни, сгенерированное сборкой, для компиляции.

Дотнет-басня использует paket.lock? Если так, то почему сборка Fable не предоставляет пакет nuget, потому что вы должны установить его, если вы не хотите тратить следующие 3 дня на копирование / связывание файлов и работу с package.lock.

В компиляторе fable отсутствуют некоторые инструкции о том, как на самом деле его использовать. Я могу скомпилировать его, но так как он не генерирует nuget, его невозможно установить. Запуск двоичных файлов напрямую тоже не работает.

Есть ли способ построить проект, используя двоичные файлы, сгенерированные последней сборкой из git-репозитория компилятора fable, и использовать его для переноса проекта?

Я попытался установить более новые версии, изменив paket.dependencies:

source https://www.nuget.org/api/v2

nuget Fable.Compiler 1.3.0-beta-002 beta
nuget FSharp.Core
nuget Fable.Core prerelease
nuget Fable.Import.Browser

clitool dotnet-fable 1.3.0-beta-002

group Build
framework: net46

    source https://nuget.org/api/v2
    nuget FSharp.Core  redirects:force, content:none
    nuget FAKE

Затем попробовал следующую команду

dotnet restore

Это, кажется, не делает ничего такого, что пытались:

mono .paket/paket.exe update

Это изменило paket.lock на:

dotnet-fable (1.3.0-beta-002) - clitool: true
   ...
Fable.Compiler (1.3.0-beta-002)
   ...
Fable.Core (1.3.0-beta-002)

Но все равно басня dotnet не будет работать 1.3.0:

[harm@localhost fable-powerpack]$ dotnet fable yarn-run pretest
Fable (1.2.0-beta-005) daemon started on port 61225

Source все еще поставляется с ядром fable 1.2.0, так что, черт возьми, он снова попробовал следующую команду:

dotnet restore

А теперь попробуй транспилировать

[harm@localhost fable-powerpack]$ dotnet fable yarn-run pretest
Fable (1.3.0-beta-002) daemon started on port 61225

Это приводит к предупреждениям:

WARNING in ./src/IndexedDB.fs
157:30-34 "export 'Some' was not found in '../../../.nuget/packages/fable.core/1.2.0-beta-003/fable-core/Util'

И код, который не работает:

TypeError: __WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_2_0_beta_003_fable_core_Util__.Some is not a constructor at openCursor (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:3527:191) at IDBObjectStore_openCursorAsync (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:3668:10) at file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:4685:123 at file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:4642:28 at Object.then (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:1936:22) at IDBOpenDBRequest.request.onsuccess (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:3803:36)
message
:
"__WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_2_0_beta_003_fable_core_Util__.Some is not a constructor"
stack
:
"TypeError: __WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_2_0_beta_003_fable_core_Util__.Some is not a constructor↵    at openCursor (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:3527:191)↵    at IDBObjectStore_openCursorAsync (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:3668:10)↵    at file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:4685:123↵    at file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:4642:28↵    at Object.then (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:1936:22)↵    at IDBOpenDBRequest.request.onsuccess (file:///home/harm/dev/fable-powerpack/build/tests.bundle.js:3803:36)"
__proto__
:
Error

Тем не менее упорно пытается басни ядро ​​1.2.0

Итак, ищем эту версию:

[harm@localhost fable-powerpack]$ grep -rl "1.2.0.beta.003"
obj/fsac.cache
tests/obj/project.assets.json
tests/obj/fsac.cache
build/tests.bundle.js

tests/obj/project.assets.json имеет более 5400 строк, так что не собираюсь возиться с этим.

Итак, попробовал следующее:

[harm@localhost fable-powerpack]$ cd tests/
[harm@localhost tests]$ mono ../.paket/paket.exe update
[harm@localhost tests]$ dotnet restore

Это, кажется, позаботится об этом:

[harm@localhost fable-powerpack]$ grep -rl "1.2.0.beta.003"
obj/fsac.cache
tests/obj/fsac.cache
build/tests.bundle.js

...

Это, кажется, использует последние басни, но последние басни компилируются в:

function openCursor(index, keyCursor, range, direction, step) {
  var range_1 = range != null ? range : null;
  var direction_1 = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_3_0_beta_002_fable_core_Util__["g" /* toString */])(direction != null ? direction : DBCursorDirection.Default);
  var step_1 = step != null ? step : 1;
  var request = keyCursor ? index.openKeyCursor(new __WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_3_0_beta_002_fable_core_Util__["f" /* Some */](range_1), direction_1) : index.openCursor(new __WEBPACK_IMPORTED_MODULE_1__nuget_packages_fable_core_1_3_0_beta_002_fable_core_Util__["f" /* Some */](range_1), direction_1);

То же, что 1.2.4, поэтому ошибки при запуске скрипта.

1 ответ

Решение

Вложенная опция предупреждения и ошибки в скомпилированном JavaScript устранена.

Установка зависимостей paket, которые вы можете выполнить (берет версии из paket.dependencies и заново создает paket.lock):

mono .paket/paket.exe update
dotnet restore

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

export PAKET_RESOLVER_TASK_TIMEOUT=-1

В этом случае вам нужно запустить dotnet restore снова в тестовой директории

Другие вопросы по тегам