2

免责声明:我是JsonixJsonix Schema Compiler的作者,我正在尝试找出 Jsonix Schema Compiler 应该集成到 NPM 中的规范方式package.json

NPM 包提供了一个基于 Java的jsonix-schema-compiler代码生成工具。如果jsonix-schema-compiler作为依赖项安装,则它可用于生成 XML<->JS 映射。调用类似于:

java -jar node_modules/jsonix-schema-compiler/lib/jsonix-schema-compiler-full.jar
    schema.xsd

这会生成一个 JavaScript 文件Mappings.js,它基本上是模块代码的一部分。

理想情况下,jsonix-schema-compiler上面的调用(java -jar ...等等)应该在模块构建期间执行。但必须在安装模块依赖node_modules/jsonix-schema-compiler执行(否则会丢失)。

我的问题是 - 我应该在哪里规范地配置 NPM 包中的代码生成?

现在我正在postinstall脚本中执行此操作,例如:

{
    ...
    "dependencies": {
        "jsonix": "x.x.x",
        "jsonix-schema-compiler": "x.x.x"
    },
    "devDependencies" : {
        "nodeunit" : "~0.8.6"
    },
    "scripts": {
        "postinstall" : "java -jar node_modules/jsonix-schema-compiler/lib/jsonix-schema-compiler-full.jar schema.xsd",
        "test": "nodeunit src/test/javascript/tests.js" 
    }
}

但是读过这个

tl;博士不要使用安装。使用 .gyp 文件进行编译,并为其他任何内容预发布。

您几乎不必显式设置预安装或安装脚本。如果您这样做,请考虑是否有其他选择。

我现在很困惑是否postinstall也可以。

我想要做的就是能够在安装依赖项之后但在其他事情(如测试或发布)之前执行某个命令行命令。我应该如何规范地做到这一点?

4

1 回答 1

1

通常人们正在运行诸如coffeescript-to-javascript 编译器、Ecmascript 6->5 转译器和缩小器之类的东西作为构建步骤,这听起来就像你正在做的那样。

预发布和安装后的区别在于预发布脚本可能会在您签出的目录中运行,因此可以合理地假设它java可用并且各种开发依赖项可用;而安装后脚本将在每次安装后运行,如果 java(等)不可用,则会失败,就像在极简主义的 docker 映像上一样。因此,您应该将构建步骤放在预发布或类似脚本中。

我个人喜欢做的是在 package.json 中定义一个脚本“mypublish”,以确保所有测试通过,运行构建,确保构建工件存在,然后运行npm publishprepublish我发现这比用作“我即将发布”的钩子更直观,而不是“在发布前进行构建”。

这是一个使用此设置的 package.json:httpsprepublish ://github.com/reid/node-jslint/blob/master/package.json,这是带有目标的 Makefile : https ://github.com/reid/节点-jslint/blob/master/Makefile

如果您有更多问题,请告诉我;我有点漫无边际,因为有很多合法的方法可以完成它——只要你避免使用postinstall脚本。;-)

于 2014-12-27T05:38:27.487 回答