Как собрать и запустить компилятор 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
снова в тестовой директории