Knex: Knex cli 应该支持 es6 进行配置和迁移

创建于 2016-02-26  ·  42评论  ·  资料来源: knex/knex

如果 knex cli 支持 es6 进行配置和迁移,那就太好了。 也许这可能在标志后面,或者仅当当前工作目录中有.babelrc文件时。

PR please feature request

最有用的评论

@jeremejevs好主意...与

{
  "scripts": {
    "knex": "babel-node node_modules/.bin/knex"
  }
}

你可以这样使用它

npm run knex migrate:latest

无需为所有 Knex 命令创建单独的脚本。

所有42条评论

这绝对会很棒。 很高兴接受这个 PR。

对不起。 之前的评论应该是针对第 1220 期的,但我错误地将评论放在这里。

@rhys-vdw 你知道需要什么吗?

@ rhys -

require("babel-register")到 CLI 入口点可能会起作用。

确认 - 将其添加到我的种子文件中并运行 ES2015! 也许应该是knexfile.js一个选项来设置compiler ,就像 mocha 在他们的 CLI 中所做的那样?

我终于让我的工作了:

数据库配置文件

export default {
    devDB: {
        client: 'sqlite3',
        connection: {
            filename: './db.sqlite3',
        },
        pool: {
            min: 1,
            max: 1,
        },
    },
    migrations: {
        directory: './migrations',
        tableName: '_migrations',
    },
    seeds: {
        directory: './seeds/dev'
    },
    pool: {
        min: 1,
        max: 1,
    }
}

knexfile.js

require('babel-register')
const config = require('./db.config').default // <- this -.-

module.exports = config

.babelrc

{
    "env": {
        "devDB": {
            "plugins": ["transform-es2015-modules-commonjs"]
        }
    }
}

但是我无法更改种子路径,当它们不在 ./seeds 中时,我总是会得到

No seed files exist

迁移也一样..

另一种选择是使用babel-node运行 Knex,在babel-cli可用,如下所示:

{
  "scripts": {
    "db:migrate:latest": "babel-node node_modules/.bin/knex migrate:latest"
  }
}

如果您的应用程序导入knexfile.js而已经被 Babel 处理,则您可能想要这样做,从而导致require('babel-register')选项不可用。

@jeremejevs好主意...与

{
  "scripts": {
    "knex": "babel-node node_modules/.bin/knex"
  }
}

你可以这样使用它

npm run knex migrate:latest

无需为所有 Knex 命令创建单独的脚本。

@olalonde 是的,这也有效! 我只是更喜欢有明确的“db: migrate:make ”和“db: migrate:latest ”脚本,以防我在半年后忘记确切的措辞(是“make”?还是“make-migration”?或“migrate:制作”?或“迁移:新”?或...)🙂

@olalonde很棒的提议! 然后你可以使用 npm 脚本“组合”,如:

{
    "knex": "babel-node node_modules/.bin/knex",
    "migrate": "npm run knex -- migrate:latest --env ",
}

也许这也有帮助: https :

操作系统:windows
[email protected]
[email protected]

// migrations/contacts.js
export function up (knex) {
  return knex.schema
    .createTable('contacts', table => {
      table.increments('id').primary()
      table.string('firstName')
      table.string('lastName')
      table.string('emailAddress')
    })
}

export function down(knex) {
  return knex.schema
    .dropTable('contacts')
}
$ npx knex migrate:latest
Using environment: development
migrations/contacts.js:1
(function (exports, require, module, __filename, __dirname) { export function up (knex) {
                                                              ^^^^^^
SyntaxError: Unexpected token export
    at Object.exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:543:28)
    ...
$ npx babel-node node_modules/.bin/knex migrate:latest
./node_modules/.bin/knex:2
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
          ^^^^^^^
SyntaxError: missing ) after argument list
    at Object.exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:543:28)
    ...
$ npx babel-node node_modules/knex/bin/cli.js migrate:latest
Using environment: development
Batch 1 run: 1 migrations
migrations/contacts.js

当我尝试@olalonde的建议、 npm run knex migrate:makenpm run knex以及任何其他参数时,只是退出而不显示任何内容。 只需运行npm run knex正常显示用法。 npm 文档说我需要将--放在像npm run knex -- migrate:make这样的脚本参数之前,但仍然没有输出。

在 *nix 上使用reify (快速!)(不知道 Windows 上的别名同义词,抱歉!)

/*

  npm install --save-dev reify
  echo '.reify-cache/' >> .gitignore
  alias knex='node -r reify ./node_modules/.bin/knex

  knex migrate:latest # …etc

*/

const table = 'foo';

export const up = knex => {
  return knex.schema.createTable(table, t => {
    t.increments();
    // …etc
    t.timestamps();
  });
};

export const down = knex => knex.schema.dropTable(table);

// OR

// export function up (knex) {
//   return knex.schema.createTable(table, t => {
//     t.increments();
//     // …etc
//     t.timestamps();
//   });
// }

// export function down (knex) {
//   knex.schema.dropTable(table);
// }

任何 es6ifying knexfile.js 尝试都很丑陋,但我可以使用 module.exports 忍受单一异常

通过以下方式继续获得No knexfile found in this directory. Specify a path with --knexfile

// src/knexfile.js
import config from 'config'

export default {
  debug: false,
  settings: config.get('dbConfig'),
  seeds: {
    directory: './seeds/'
  }
}
//package.json
 "scripts": {
    "knex": "babel-node node_modules/.bin/knex"
  }

``
yarn knex migrate:make lol
````

任何指针? 似乎只是一个工作目录问题(我猜)🤔

@haywirez你确定这与这张票的主题有关吗?无论如何,试着按照它的要求去做,添加 --knexfile 指向你的 knexfile.js

@haywirez的问题可能是因为export default { ... }需要为const file = require('/path/to/knexfile').default才能进行 ESM 互操作。

此外,当 knex cli 使用时,Liftoff 允许使用--require标志来要求诸如esmbabel-register 。 不幸的是,由于此命令未在 Commander 中注册,因此 knex cli 在esm要求后死亡:

± |master ?:18 ✗| → npx knex --require esm seed:make admin_user
Requiring external module esm

  error: unknown option `--require'

该项目是否会向 PR 开放以在所有命令上启用--require并确保knexfile上的互操作?

https://github.com/tgriesser/knex/issues/1232#issuecomment -411775132 还允许您为别名路径名注册tsconfg-paths ,这在使用打字稿制作种子时很有用。 ts-node打算支持别名路径,因此当我在将数据持久化到数据库之前制作需要一些复杂转换的种子时,这会成为问题。 如果我们暴露了--require标志,我可以自己解决这个问题。

或者,如果其他人遇到此问题,您可以在没有--require标志的情况下通过执行以下操作来解决它:

node -r tsconfig-paths/register node_modules/.bin/knex seed:run

@olalonde在所有流行的 Node.js 版本都支持 ES6 开箱即用的世界中,这仍然相关吗?

@kibertoad Node 还不支持 ESModules。

@mAAdhaTTah它有点像: https : //nodejs.org/api/esm.html

@kibertoad是的,但它非常具有实验性且不稳定,因此您不能依赖它。

如果您在 Windows 上使用esm ,请尝试以下操作:
node -r esm node_modules/knex/bin/cli.js migrate:make migration_name

在 Linux 和 Mac 上,尝试
node -r esm node_modules/.bin/knex migrate:make migration_name

所以我在这张票上看到的最后一次更新涉及 esm 并且已经超过半年了......从那以后有人设法让这个与 Babel 一起工作吗? 我对 Babel 的所有更改特别好奇,而且该库似乎更喜欢使用 @babel/register 而不是 babel-node。

@machineghost你可以试试最新的大师,它不使用任何转译,所以可能会更好。 如果您遇到任何剩余的限制,请告诉我。

它似乎仍然不起作用。 我的package.json如下:

"knex": "npx @babel/node node_modules/.bin/knex --knexfile=src/database/knexfile.js",
"migrate": "npm run knex migrate:latest",

// ...
"dependencies": {
// ...
"knex": "git://github.com/tgriesser/knex.git#master",
// ...

我的knexfile.js非常简单:

import { development } from './realKnexFile';
module.exports = {
    development
};

但它不能越过第一行。 当我运行npm run migrate我得到:

knexfile.js:1
import { development } from './realKnexFile';
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:760:23)

发现了惊人的“esm”模块(来自 Lodash 的创建者)后,人们甚至不再需要 Babel 参与其中。 实际上所有的 Knex 需要支持 ES6 模块,超级简单,只是在幕后将--require esm传递给node的一种方式。

如果knex命令行可以简单地将-r传递给 Node,它不仅可以解决这个问题,还可以解决任何其他需要在运行 Knex 之前运行 Node 模块的问题。

-编辑-

-r参数存在之前,可以通过执行以下操作在所有 _required_ 模块中使用 ES6 语法(但不能在knexfile.js本身中):

require = require("esm")(module);
const importedContent = require('./someFile.js');

这将使require本身可以很好地处理 ES6 模块......但是knexfile.js仍然必须使用requiremodule.exports-r选项可以解决这个问题。

万一有人找,下面是关于如何使用一个完整的例子ESM将工作与knex

knexfile.js

const config = {
}

// Knex will fail if you use "exports default"
module.exports = config

包.json

{
  "scripts": {
    "knex": "node -r esm node_modules/.bin/knex",
    "db:migrate": "yarn knex migrate:latest"
  }
}

随着 ESM 变得越来越流行,我愿意为让 Knex 与 Node > 12 一起工作做出一些贡献。 我有一些在 Node 中使用 ESM 的经验,所以希望一切顺利。 不幸的是,我不能告诉你我什么时候可以开始做这件事,因为我不能在工作时间(与业务无关)工作。 我还需要一分钟来习惯 knex 代码库

我认为这可能就像添加require('esm')作为新的第一行一样简单......如果图书馆的作者对新的依赖关系没问题。

@jhechtf @machineghost看看这个:
https://github.com/knex/knex/pull/3616
https://github.com/knex/knex/pull/3639
https://github.com/knex/knex/pull/3638

Liftoff 支持也已修复,因此在进行更多更改之前,编写一些测试以找出哪些有效,哪些无效会有所帮助。
也就是说,如果有人调查所有这些并决定仍然需要什么工作(如果有的话)并贡献一些测试,那将非常有帮助。

是的,你们使用了官方的 Node 解决方案,它尚未完全成熟。

恕我直言,“esm”模块解决方案要简单得多,并且不需要任何特殊标志:它只会使库 ES Module 在所有 Node 环境中对每个人都友好(很可能只有一个 require 行,正如我所说) .

它来自创造 Lodash 的人; JDD 摇滚。

@machineghost https://github.com/knex/knex/pull/3639使用 babel,所以这是另一种方式。 我想我看到有人在尝试esm模块方法,但由于某种原因现在找不到 PR。

好吧,FWIW 该库是我目前最快的堆栈溢出点来源 ;)

我在这里发现并推荐给其他人: https :

现在我每隔几天就会收到一个新的赞成票,因为它确实是 ESM 的一个很棒的(可以说是目前最好的)解决方案。

@machineghost你希望它的介绍基于现有的代码库有多大的侵入性?

我认为这是其中之一“它应该没有任何影响,但因为它会影响您必须测试以确保的所有内容”交易。

我没有看过它的内部,但鉴于该项目在社会上的形象,也许如果有人问@jdalton他可能在权衡风险(比我的更加知情的意见?):crossed_fingers:

@machineghost您可以查看https://github.com/knex/knex/pull/3616以了解原始实现的影响。 如果引入esm ,可能必须删除或替换它。

我没有带宽ATM,但有时间我会看看。 也许@jhechtf可以更快?

是的,你们使用了官方的 Node 解决方案,它尚未完全成熟。

@machineghost :嗯......我相信--esm标志实际上是使用你提到的esm模块:

https://github.com/knex/knex/blob/0f523db957138cc0423723c699c9ce52db5feb14/bin/cli.js#L52 -L55

相关说明:您刚刚提醒我,我打算在合并Liftoff增强功能后修复--require标志。 我现在应该去做那个......

哦,对不起! 我扫描得太快了,看到了“ node ${KNEX} --esm ”,只是看了看那里的变量,认为您直接将一个 arg 传递给 Node 以告诉它使用 Node 的版本。

听起来这已经解决了,只是在问题线程中并不清楚; 干得好:+1:

NP! 看起来这个功能是@D10221在这个 PR 中添加的:

https://github.com/knex/knex/pull/3616

所以,他们值得称赞🎉

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

rarkins picture rarkins  ·  3评论

npow picture npow  ·  3评论

arconus picture arconus  ·  3评论

ghost picture ghost  ·  3评论

fsebbah picture fsebbah  ·  3评论