免责声明:我是JsonixJsonix Schema Compiler的作者,我试图弄清楚将Jsonix Schema Compiler集成到NPM package.json中的规范方法。

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

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


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

理想情况下,应该在模块构建期间执行上面的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"
    }
}


但是,已阅读this


  tl; dr不要使用install。使用.gyp文件进行编译,然后
  预发布其他任何内容。
  
  您几乎永远不必显式设置预安装或安装
  脚本。如果您这样做,请考虑是否还有其他
  选项。


如果postinstall也可以,我现在感到困惑。

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

最佳答案

通常,人们正在运行诸如coffeescript-to-javascript编译器,Ecmascript 6-> 5编译器和缩小器之类的事情,这是听起来很像您正在做的事情。

在发布前和安装后执行之间的区别在于,预发布脚本可能要在您签出的目录中运行,因此可以合理地假设java可用并且各种开发依赖项都可用。而安装后脚本将在每次安装后运行,并且在java(etc.)不可用的情况下将失败,例如在简约的docker映像上。因此,您应该将构建步骤放入预发布或类似的脚本中。

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

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

如果您还有其他问题,请告诉我;我有点无聊,因为有很多合法的方法可以完成它-只要避免使用postinstall脚本即可。 ;-)

08-04 13:16