Knex: Knex cli должен поддерживать es6 для настройки и миграции

Созданный на 26 февр. 2016  ·  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 Комментарий

Определенно это было бы здорово. Рад принять пиар для этого.

Извините. Этот предыдущий комментарий должен был относиться к выпуску 1220, но я по ошибке поместил его здесь.

@ rhys-vdw ты знаешь, что для этого нужно?

@ rhys-vdw @jmfurlott . На самом деле я тоже заинтересован в этом, так как считаю, что это было бы действительно круто. Как вы думаете, можете ли вы указать нам на компоненты, которые мы должны изучить, чтобы попытаться сделать это возможным. Некоторое понимание поможет

Добавление require("babel-register") в точку входа CLI может просто сработать.

Подтверждено - добавил это в мой исходный файл и запустил ES2015! Может быть, в knexfile.js должна быть опция для установки compiler , как это делает мокко с их CLI?

Наконец-то я заработал:

db.config.js

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

То же самое и для миграций ..

Другой вариант - запустить Knex с babel-node , доступным в 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: make "? или" migrate: new "? или ...) 🙂

@olalonde отличное предложение! Затем вы можете использовать "состав" скриптов npm, например:

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

Возможно, это тоже может помочь: https://github.com/standard-things/esm

ОС: 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:make или npm run knex с любыми дополнительными аргументами просто выходит, ничего не отображая. Однако простой запуск npm run knex отображает использование как обычно. Документы npm говорят, что мне нужно поставить -- перед аргументами скрипта, такими как npm run knex -- migrate:make , но это все равно завершается без вывода.

Использование reify (быстро!) В * nix (не знаю, как использовать синоним псевдонима в 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"
  }

`` ''
пряжа knex migrate: make lol
`` ''

Есть указатели? Кажется, это просто проблема с рабочим каталогом (я думаю) 🤔

@haywirez Вы уверены, что это связано с темой этого тикета? .. В любом случае, попробуйте сделать именно то, что он просит, добавьте --knexfile, который будет указывать на ваш knexfile.js

Возможно, проблема с @haywirez связана с тем , что export default { ... } должно быть const file = require('/path/to/knexfile').default для взаимодействия ESM.

Кроме того, Liftoff, используемый knex cli, позволяет использовать флаг --require для запроса чего-то вроде esm или babel-register . К сожалению, поскольку эта команда не зарегистрирована в Commander, команда knex умирает после запроса в 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 Да, но он очень экспериментальный и нестабильный, поэтому на него нельзя полагаться.

Если вы используете esm , в Windows попробуйте следующее:
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, это решило бы не только этот тикет, но и любую другую проблему, когда кому-то нужно запустить модуль Node перед запуском Knex.

-РЕДАКТИРОВАТЬ-

Пока существует аргумент -r , можно использовать синтаксис ES6 во всех _required_ модулях (но не в самом knexfile.js ), выполнив:

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

Это заставит require самостоятельно обрабатывать модули ES6 ... но knexfile.js прежнему должен использовать require и module.exports ; вариант -r решит эту проблему.

Если кто-то ищет, вот полный пример того, как использовать esm для работы с knex.

knexfile.js

const config = {
}

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

package.json

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

Поскольку ESM становится все более популярным, я хотел бы внести свой вклад, чтобы Knex мог работать с Node> 12. У меня есть некоторый опыт работы с ESM в Node, так что, надеюсь, все пройдет гладко. К сожалению, я не могу сказать вам, когда смогу начать работу над этим, поскольку я не могу работать над этим в рабочее время (не связанное с бизнесом). Мне также понадобится минута, чтобы привыкнуть к кодовой базе 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, которое еще не полностью готово.

IMHO решение модуля "esm" намного проще и не требует какого-либо специального флага: оно просто сделает библиотечный модуль ES Module дружественным для всех во всех окружениях Node (очень вероятно, с единственной строкой require, как я уже сказал) .

Это от парня, создавшего Lodash; JDD качается.

@machineghost https://github.com/knex/knex/pull/3639 использует babel, так что это еще один способ. Думаю, я видел, как кто-то пробовал использовать модульный подход esm , но по какой-то причине не могу найти PR сейчас.

Что ж, эта библиотека - мой текущий самый быстрый источник точек переполнения стека;)

Я открыл его и рекомендовал его к другим здесь: https://stackoverflow.com/questions/47277887/node-experimental-modules-requested-module-does-not-provide-an-export-named/54302557#54302557

и теперь я получаю новые голоса каждые несколько дней, потому что это действительно отличное (возможно, лучшее на данный момент) решение для ESM.

@machineghost Насколько навязчиво, по вашему мнению, его введение будет основано на существующей кодовой базе?

Я думаю, что это одна из тех сделок, «которые не должны иметь никакого эффекта, но поскольку это влияет на все, что вам нужно проверить, чтобы быть уверенным».

Я не изучал его внутреннее устройство, но, учитывая профиль этого проекта в сообществе, возможно, если бы кто-то спросил @jdalton, он мог бы взвесить риски (с гораздо более информированным мнением, чем мое?): Cross_fingers:

@machineghost Вы можете взглянуть на https://github.com/knex/knex/pull/3616, чтобы увидеть, как повлияла исходная реализация. Вероятно, его придется удалить или заменить, если будет введено esm .

У меня нет банкомата с пропускной способностью, но я посмотрю, когда у меня будет время. Может быть, @jhechtf сможет раньше?

Да, вы, ребята, выбрали официальное решение Node, которое еще не полностью готово.

@machineghost : Хм ... Я считаю, что флаг --esm самом деле использует упомянутый вами модуль esm :

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

По теме: вы только что напомнили мне, что я собирался исправить флаг --require после слияния улучшений Liftoff . Я должен сделать это сейчас ...

О, мои извинения! Я сканировал слишком быстро, увидел « node ${KNEX} --esm », просто посмотрел мимо переменной и подумал, что вы передаете аргумент в Node напрямую, чтобы указать ему использовать версию Node.

Похоже, что это уже было решено, и это просто не было ясно из ветки проблемы; хорошая работа: +1:

нп! Похоже, эта функция была добавлена @ D10221 в этот PR:

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

Итак, они заслуживают похвалы 🎉

Была ли эта страница полезной?
0 / 5 - 0 рейтинги