Knex: Knex cli harus mendukung es6 untuk konfigurasi dan migrasi

Dibuat pada 26 Feb 2016  ·  42Komentar  ·  Sumber: knex/knex

Akan lebih baik jika knex cli mendukung es6 untuk konfigurasi dan migrasi. Mungkin ini bisa berada di belakang bendera atau hanya ketika ada file .babelrc di direktori kerja saat ini.

PR please feature request

Komentar yang paling membantu

@jeremejevs ide bagus... dengan

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

Anda bisa menggunakannya dengan cara ini

npm run knex migrate:latest

tanpa harus membuat skrip terpisah untuk semua perintah Knex.

Semua 42 komentar

Pasti ini akan sangat bagus. Senang menerima PR untuk yang satu ini.

Maaf. Komentar sebelumnya seharusnya untuk edisi 1220, tetapi saya salah memasukkan komentar itu di sini.

@rhys-vdw apakah Anda tahu apa yang diperlukan?

@rhys-vdw @jmfurlott . Saya sebenarnya tertarik untuk mengejar ini juga karena menurut saya ini akan menjadi fitur yang sangat keren untuk dimiliki. Apakah Anda pikir Anda dapat mengarahkan kami ke komponen yang harus kami jelajahi untuk mencoba dan membuat ini menjadi kemungkinan. Beberapa wawasan akan membantu

Menambahkan require("babel-register") ke titik masuk CLI mungkin berhasil.

Dikonfirmasi - menambahkannya ke file seed saya dan menjalankan ES2015! Mungkin harus menjadi opsi di knexfile.js untuk mengatur compiler , seperti yang dilakukan moka dengan CLI mereka?

Saya akhirnya mendapatkan pekerjaan saya:

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"]
        }
    }
}

Namun saya tidak dapat mengubah jalur benih, ketika mereka tidak berada di ./seeds saya akan selalu mendapatkan

No seed files exist

Sama juga untuk migrasi..

Pilihan lain adalah menjalankan Knex dengan babel-node , tersedia di babel-cli , seperti:

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

Anda mungkin ingin melakukan ini jika aplikasi Anda mengimpor knexfile.js saat sudah diproses oleh Babel, membuat opsi require('babel-register') tidak dapat digunakan.

@jeremejevs ide bagus... dengan

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

Anda bisa menggunakannya dengan cara ini

npm run knex migrate:latest

tanpa harus membuat skrip terpisah untuk semua perintah Knex.

@olalonde Ya, itu juga berhasil! Saya hanya lebih suka memiliki skrip eksplisit "db: migrasi:make " dan "db: migrasi:terbaru " jika saya lupa kata-kata persisnya setengah tahun kemudian (apakah itu "membuat"? atau "membuat-migrasi"? atau "migrasi: buat"? atau "migrasi:baru"? atau...)

@olalonde proposal yang bagus! Kemudian Anda dapat menggunakan "komposisi" skrip npm seperti:

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

Mungkin ini bisa membantu juga: https://github.com/standard-things/esm

OS: 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

Ketika saya mencoba saran @olalonde , npm run knex migrate:make , atau npm run knex dengan argumen tambahan apa pun, keluar saja tanpa menampilkan apa pun. Hanya menjalankan npm run knex menampilkan penggunaan seperti biasa. npm docs mengatakan bahwa saya harus meletakkan -- sebelum argumen skrip seperti npm run knex -- migrate:make , tetapi itu masih keluar tanpa output.

Menggunakan reify (cepat!) di *nix (tidak tahu tentang sinonim alias di windows, maaf!)

/*

  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);
// }

Setiap upaya es6ifying knexfile.js jelek tapi saya bisa hidup dengan satu anomali menggunakan module.exports

Terus dapatkan No knexfile found in this directory. Specify a path with --knexfile dengan yang berikut:

// 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"
  }

```
benang knex bermigrasi: buat lol
````

Ada petunjuk? Tampaknya hanya masalah direktori yang berfungsi (saya kira)

@haywirez Apakah Anda yakin ini terkait dengan topik tiket ini?.. Bagaimanapun, coba lakukan persis seperti yang diminta, tambahkan --knexfile yang akan menunjuk ke knexfile.js Anda

Mungkin masalah @haywirez ' adalah karena export default { ... } harus const file = require('/path/to/knexfile').default untuk interop ESM.

Juga, Liftoff, seperti yang digunakan oleh knex cli, memungkinkan flag --require untuk membutuhkan sesuatu seperti esm atau babel-register . Sayangnya, karena perintah ini tidak terdaftar di Commander, knex cli mati setelah membutuhkan esm :

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

  error: unknown option `--require'

Apakah proyek akan terbuka untuk PR untuk mengaktifkan --require pada semua perintah serta memastikan interop pada knexfile ?

https://github.com/tgriesser/knex/issues/1232#issuecomment -411775132 juga akan memungkinkan Anda untuk mendaftarkan tsconfg-paths untuk nama path alias, yang berguna saat membuat seed dengan TypeScript. ts-node tidak berencana untuk mendukung jalur alias jadi ini menjadi masalah ketika saya membuat seed yang memerlukan beberapa transformasi kompleks sebelum menyimpan data ke database. Jika kami mengekspos flag --require saya bisa mengatasinya sendiri.

Atau, jika orang lain mengalami masalah ini, Anda dapat mengatasinya tanpa flag --require dengan melakukan:

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

@olalonde Apakah ini masih relevan di dunia di mana semua versi Node.js populer mendukung ES6 out-of-the-box?

@kibertoad Node belum mendukung ESModules.

@mAAdhaTTah Agak seperti itu: https://nodejs.org/api/esm.html

@kibertoad Ya, tapi ini sangat eksperimental & tidak stabil, jadi Anda tidak bisa mengandalkannya.

Jika Anda menggunakan esm , di Windows, coba ini:
node -r esm node_modules/knex/bin/cli.js migrate:make migration_name .

Di Linux dan Mac, coba
node -r esm node_modules/.bin/knex migrate:make migration_name

Jadi pembaruan terakhir yang saya lihat di tiket ini melibatkan esm dan berusia lebih dari setengah tahun ... adakah yang berhasil membuatnya bekerja dengan Babel sejak? Saya sangat ingin tahu dengan semua perubahan pada Babel, dan tampaknya preferensi perpustakaan baru untuk menggunakan @babel/register alih-alih babel-node.

@machineghost Anda dapat mencoba master terbaru, tidak menggunakan transpilasi apa pun, jadi mungkin berfungsi lebih baik. Jika Anda mengalami keterbatasan yang tersisa, beri tahu saya.

Tampaknya masih tidak berhasil. package.json adalah sebagai berikut:

"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",
// ...

dan knexfile.js sangat sederhana:

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

Tapi itu tidak bisa melewati baris pertama. Ketika saya menjalankan npm run migrate saya mendapatkan:

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

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

Setelah menemukan modul "esm" yang luar biasa (dari pencipta Lodash), seseorang bahkan tidak perlu melibatkan Babel lagi. Benar-benar semua kebutuhan Knex untuk mendukung modul ES6, dengan sangat mudah, hanyalah cara untuk meneruskan --require esm ke node belakang layar.

Jika baris perintah knex dapat dengan mudah mengambil -r dan meneruskannya ke Node, itu tidak hanya akan menyelesaikan tiket ini tetapi juga masalah lain di mana seseorang perlu menjalankan modul Node sebelum menjalankan Knex.

-EDIT-

Sampai argumen -r ada, seseorang dapat menggunakan sintaks ES6 di semua modul _required_ (tetapi tidak dalam knexfile.js itu sendiri) dengan melakukan:

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

Ini akan membuat require sendiri menangani modul ES6 dengan baik ... tetapi knexfile.js masih harus menggunakan require dan module.exports ; opsi -r akan menyelesaikannya.

Jika seseorang melihat, berikut adalah contoh lengkap tentang cara menggunakan esm untuk bekerja dengan 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"
  }
}

Dengan ESM menjadi lebih populer, saya akan bersedia memberikan kontribusi untuk memungkinkan Knex bekerja dengan Node>12. Saya memiliki sedikit pengalaman bekerja dengan ESM di Node, jadi semoga ini berjalan lancar. Sayangnya saya tidak bisa memberi tahu Anda kapan saya bisa memulai ini karena saya tidak bisa mengerjakannya selama jam kerja (tidak terkait bisnis). Saya juga perlu waktu sebentar untuk terbiasa dengan basis kode knex

Saya pikir ini mungkin sesederhana menambahkan require('esm') sebagai baris baru ... jika penulis perpustakaan setuju dengan ketergantungan baru.

@jhechtf @machineghost Lihat ini:
https://github.com/knex/knex/pull/3616
https://github.com/knex/knex/pull/3639
https://github.com/knex/knex/pull/3638

Juga dukungan Liftoff telah diperbaiki, jadi sebelum melakukan lebih banyak perubahan, akan sangat membantu untuk menulis beberapa tes untuk mencari tahu apa yang berhasil dan apa yang tidak sekarang.
Yang mengatakan, jika seseorang menyelidiki semua ini dan memutuskan pekerjaan apa (jika ada) yang masih diperlukan dan menyumbangkan beberapa tes, itu akan sangat membantu.

Ya, kalian menggunakan solusi Node resmi, yang belum sepenuhnya matang.

IMHO solusi modul "esm" jauh lebih sederhana, dan tidak memerlukan tanda khusus: itu hanya akan membuat perpustakaan Modul ES ramah untuk semua orang, di semua lingkungan Node (sangat mungkin dengan hanya satu baris persyaratan, seperti yang saya katakan) .

Itu dari orang yang membuat Lodash; Batu JDD.

@machineghost https://github.com/knex/knex/pull/3639 menggunakan babel, jadi itu salah satu cara lain. Saya rasa saya melihat seseorang mencoba pendekatan modul esm , tetapi untuk beberapa alasan tidak dapat menemukan PR sekarang.

Nah, FWIW perpustakaan itu adalah sumber poin Stack Overflow tercepat saya saat ini;)

Saya menemukannya dan merekomendasikannya kepada orang lain di sini: https://stackoverflow.com/questions/47277887/node-experimental-modules-requested-module-does-not-provide-an-export-named/54302557#54302557

dan sekarang saya mendapatkan upvote baru setiap beberapa hari karena ini benar-benar solusi yang bagus (bisa dibilang yang terbaik , saat ini) untuk ESM.

@machineghost Seberapa mengganggu Anda mengharapkan pengenalannya didasarkan pada basis kode yang ada?

Saya pikir ini adalah salah satu dari ini "seharusnya tidak berpengaruh apa pun, tetapi karena itu memengaruhi semua yang harus Anda uji untuk memastikan" kesepakatan.

Saya belum melihat internalnya, tetapi mengingat profil proyek ini di komunitas, mungkin jika seseorang bertanya kepada @jdalton, dia mungkin mempertimbangkan risikonya (dengan pendapat yang jauh lebih tepat daripada saya?):crossed_fingers:

@machineghost Anda dapat melihat https://github.com/knex/knex/pull/3616 untuk melihat apa dampak dari implementasi asli. Mungkin itu harus dihapus atau diganti jika esm diperkenalkan.

Saya tidak memiliki bandwidth ATM, tetapi saya akan memeriksanya ketika saya punya waktu. Mungkin @jhechtf bisa lebih cepat?

Ya, kalian menggunakan solusi Node resmi, yang belum sepenuhnya matang.

@machineghost : Hmm... Saya yakin flag --esm sebenarnya menggunakan modul esm Anda sebutkan:

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

Pada catatan terkait: Anda baru saja mengingatkan saya bahwa saya bermaksud memperbaiki flag --require setelah peningkatan Liftoff digabungkan. Aku harus pergi melakukannya sekarang...

Maaf! Saya memindai terlalu cepat, melihat " node ${KNEX} --esm ", dan hanya melihat melewati variabel di sana dan mengira Anda meneruskan argumen ke Node secara langsung untuk menyuruhnya menggunakan versi Node.

Sepertinya ini sudah diselesaikan, dan itu tidak jelas dari utas masalah; pekerjaan yang bagus :+1:

tidak! Sepertinya fitur tersebut ditambahkan oleh @D10221 dalam PR ini:

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

Jadi, mereka pantas mendapatkan pujian

Apakah halaman ini membantu?
0 / 5 - 0 peringkat