如何从源代码构建和 运行 寓言编译器?

How to build and run fable compiler from source?

我正在尝试在寓言精灵模板项目中使用寓言 powerpack。编译时出现警告:

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

编译后的代码(测试中使用fable powerpack代码)也不行。

代码:

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) 

returns {} 而不是undefined,如果是returns 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-fable(来自 fable elmish 模板的 1.2.4)所以将 paket.lock 更改为降级(来自 fable-powerpack 的 1.2.0-beta-005)并做了一个dotnet 恢复。

现在它根本不会编译并出现错误(也许 fable react 不能与 powerpack 使用的 fable 版本一起工作):

ERROR in /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) error FSHARP: The type 'ParamList' is not defined. @ ./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 compiler 并构建它(不生成 nuget 包,但生成一些带有二进制文件的文件夹)。

在链接到构建的寓言 powerpack 中:

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

然后尝试构建 power pack indexeddb(将 tests/Main.fs 和 Tests.fsproj 更改为使用 indexeddb 的 Program.fs)

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

果然还是不行:

ERROR in ./src/IndexedDB.fs Module not found: Error: Can't resolve '../../../.nuget/packages/fable.core/1.2.0-beta-003/fable-core/Option' in '/home/harm/dev/fable-powerpack/src' @ ./src/IndexedDB.fs 9:0-102 @ ./tests/Program.fs @ ./tests/Main.fs @ ./tests/Tests.fsproj

ERROR in ./src/PromiseSeq/Module.fs Module not found: Error: Can't resolve '../../../../.nuget/packages/fable.core/1.2.0-beta-003/fable-core/Option' in '/home/harm/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,寓言构建的寓言核心是版本 1.3.0-beta-002 所以即使我使用 dotnet-fable 版本 1.3.0-beta-002 由于某种原因它不使用寓言核心由编译生成。

dotnet-fable 是否使用 paket.lock?如果是这样,那么为什么构建 Fable 不提供 nuget 包,因为如果你不想在接下来的 3 天里摆弄 copying/linking 文件并弄乱 packet.lock,你必须安装它。 =38=]

寓言编译器缺少一些关于如何实际使用它的说明。我可以编译它,但由于它不会生成 nuget,因此无法安装它。 运行 直接二进制文件似乎也不起作用。

有没有一种方法可以使用 fable 编译器 git 存储库的最新版本生成的二进制文件来构建项目并使用它来转译项目?

我尝试通过更改 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 fable还是不会运行 1.3.0:

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

源代码仍然使用 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

还在顽强地尝试fable core 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 行,所以不会 fiddle 那个。

所以尝试了以下方法:

[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

...

这似乎使用了 latest fable 但 latest fable 编译为:

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 相同,因此 运行ning 脚本时出错。

已编译 JavaScript 中的嵌套选项警告和错误是 solved

您可以安装 paket 依赖项(从 paket.dependencies 获取版本并重新创建 paket.lock):

mono .paket/paket.exe update
dotnet restore

如果 paket update 出现超时异常,您可以在 paket update 之前尝试此命令:

export PAKET_RESOLVER_TASK_TIMEOUT=-1

在这种情况下,您需要在测试目录中再次 运行 dotnet restore