1

我开始创建一个本地 Reason 单元测试库,灵感来自 RSpec(我之前为 F# 做过一个)

我想调用 library Respect,但由于已经有一个名为“respect”的 npm 包,我将 npm 库命名为“re-respect”。但我bsconfig.json将包名指定为respect

{
  "name": "Respect",
  "version": "0.1.0",
  "namespace": true,
  "sources": [
    {"dir": "src"},
    {
      "dir": "tests",
      "type": "dev"
    }
  ],
  "bs-dependencies" : [
      // add your bs-dependencies here 
  ]
}

我推送了这个包,并从一个测试项目中导入了它,我在其中引用了Respect命名空间。我在项目中有这个原因源文件:

open Respect.Dsl;

describe "Foo" [
  it "has a test" (fun _ => ())
] |> register;

!rootContext |> run;

构建代码npm run build工作正常,但是当我运行测试时,我得到了错误:

module.js:529
    throw err;
    ^

Error: Cannot find module 'Respect/lib/js/src/dsl.js'
    at Function.Module._resolveFilename (module.js:527:15)
    ...

错误很明显 - npm 包安装在它尝试查找代码的位置node_modules/re-respectnode_modules/Respect

我是否正在尝试做我不应该做的事情?我的根命名空间应该跟在 NPM 包名后面吗?我需要找一个新名字吗?

ps 在我写这篇文章时,我意识到 package.json 和 bsconfig.json 中的版本号之间存在差异 - 但我怀疑这是问题的根源。

4

1 回答 1

1

我推荐以下内容:

  • 关闭项目的命名空间
  • 保留re-respectnpm 库和bsconfig.json文件的名称
  • 保留一个文件Respect.re作为项目的主要模块。它将作为Respect模块公开公开,用户可以作为主模块访问它

这里的关键点是您并不总是需要命名空间,特别是如果您的项目自然适合单个主模块。

编辑:对于您的Dsl嵌套模块,您可能希望将其Respect.re作为语法嵌套模块保存在文件中:

/* Respect.re */
module Dsl = {
  ...
};

或者您可能希望将其保存在自己的文件中,这很好,在这种情况下您只需要做更多的工作,通过确保您的命名空间然后手动对其进行别名:

/* Respect_dsl.re */
...

/* Respect.re */
module Dsl = Respect_dsl;

...

然后用户将能够像以前一样访问它Respect.Dsl

于 2017-10-16T19:12:47.770 回答