knexcliãæ§æãšç§»è¡ã®ããã«es6ããµããŒãããã®ã§ããã°çŽ æŽãããã§ãããã ãããããããã¯ãã©ã°ã®èåŸã«ããããçŸåšã®äœæ¥ãã£ã¬ã¯ããªã«.babelrc
ãã¡ã€ã«ãããå Žåã«ã®ã¿çºçããå¯èœæ§ããããŸãã
ééããªãããã¯çŽ æŽãããããšã§ãã ããã®PRãåãã§åãå ¥ããŸãã
ãããã ãã®åã®ã³ã¡ã³ãã¯åé¡1220ã®ããã®ãã®ã§ããã¯ãã§ããããããç§ã¯èª€ã£ãŠãã®ã³ã¡ã³ããããã«çœ®ããŸããã
@ rhys-vdwäœãå¿ èŠããããã«ããããŸããïŒ
@ rhys-vdw @ jmfurlott ã ããã¯æ¬åœã«ã¯ãŒã«ãªæ©èœã ãšæãã®ã§ãç§ãå®éã«ãããè¿œæ±ããããšã«èå³ããããŸãã ãããå¯èœã«ããããã«ç§ãã¡ãæ¢æ±ãã¹ãã³ã³ããŒãã³ããç§ãã¡ã«ææã§ãããšæããŸããã ããã€ãã®æŽå¯ã圹ç«ã€ã§ããã
CLIãšã³ããªãã€ã³ãã«require("babel-register")
ãè¿œå ãããšãããŸãããå¯èœæ§ããããŸãã
確èªæžã¿-ãããã·ãŒããã¡ã€ã«ã«è¿œå ãã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
移è¡ã«ã€ããŠãåãã§ãã
å¥ã®ãªãã·ã§ã³ã¯ã次ã®ããã«ã babel-cli
ã§å©çšå¯èœãªbabel-node
ã§Knexãå®è¡ããããšã§ãã
{
"scripts": {
"db:migrate:latest": "babel-node node_modules/.bin/knex migrate:latest"
}
}
ã¢ããªããã§ã«Babelã«ãã£ãŠåŠçãããŠããéã«knexfile.js
ãã€ã³ããŒããã 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ã¹ã¯ãªãããcompositionãã䜿çšã§ããŸãã
{
"knex": "babel-node node_modules/.bin/knex",
"migrate": "npm run knex -- migrate:latest --env ",
}
å€åããã圹ç«ã€ãããããŸããïŒ https ïŒ
OSïŒãŠã£ã³ããŠ
[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 docsã¯ã npm run knex -- migrate:make
ãããªã¹ã¯ãªããåŒæ°ã®åã«--
ã眮ãå¿
èŠããããšèšã£ãŠããŸãããããã§ãåºåãªãã§çµäºããŸãã
* nixã§reify ïŒfastïŒïŒã䜿çšããããŸãããç³ãèš³ãããŸããïŒïŒ
/*
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"
}
`` `
ã€ãŒã³ããã¯ã¹ãã€ã°ã¬ãŒã·ã§ã³ïŒã¡ã€ã¯ç¬
ãã
ãã€ã³ã¿ã¯ãããŸããïŒ äœæ¥ãã£ã¬ã¯ããªã®åé¡ã®ããã§ãïŒç§ã¯æšæž¬ããŸãïŒð€
@haywirezããããã®ãã±ããã®ãããã¯ã«é¢é£ããŠããããšã確èªããŸããïŒ..ãšã«ããããããæ±ããŠããããšãæ£ç¢ºã«å®è¡ããŠã¿ãŠãã ãããknexfile.jsãæã--knexfileãè¿œå ããŠãã ããã
@haywirezã®åé¡ã¯ãESMçžäºéçšã®ããã«export default { ... }
ãconst file = require('/path/to/knexfile').default
ã§ããå¿
èŠãããããã§ããå¯èœæ§ããããŸãã
ãŸããknex cliã§äœ¿çšãããLiftoffã§ã¯ã esm
ãbabel-register
ãªã©ãèŠæ±ããããã®--require
ãã©ã°ã䜿çšã§ããŸãã æ®å¿µãªããããã®ã³ãã³ãã¯Commanderã«ç»é²ãããŠããªããããknex cliã¯esm
èŠæ±ããåŸã«çµäºããŸãã
± |master ?:18 â| â npx knex --require esm seed:make admin_user
Requiring external module esm
error: unknown option `--require'
ãããžã§ã¯ã--require
ããã¹ãŠã®ã³ãã³ãã§knexfile
çžäºéçšã確å®ã«ããããã«ãPRã«å¯ŸããŠéãããŠããŸããïŒ
https://github.com/tgriesser/knex/issues/1232#issuecomment -411775132ã§ã¯ããšã€ãªã¢ã¹ãã¹åã®tsconfg-pathsãç»é²ããããšãã§ããŸããããã¯ãtypescriptã䜿çšããŠã·ãŒããäœæãããšãã«åœ¹ç«ã¡ãŸãã ts-nodeã¯ãšã€ãªã¢ã¹ãã¹ããµããŒãããäºå®ããªããããããŒã¿ãããŒã¿ããŒã¹ã«æ°žç¶åããåã«è€éãªå€æãå¿
èŠãšããã·ãŒããäœæããå Žåãããã¯åé¡ã«ãªããŸãã --require
ãã©ã°ãå
¬éããã°ããããèªåã§åé¿ã§ããŸãã
ãŸãã¯ãä»ã®äººããã®åé¡ã«ã¶ã€ãã£ãå Žåã¯ã次ã®ããã«ããŠ--require
ãã©ã°ãªãã§åé¿ã§ããŸãã
node -r tsconfig-paths/register node_modules/.bin/knex seed:run
@olalondeããã¯ã人æ°ã®ãããã¹ãŠã®Node.jsããŒãžã§ã³ãããã«äœ¿çšã§ããES6ããµããŒãããŠããäžçã§ãé¢ä¿ããããŸããïŒ
@kibertoadããŒãã¯ãŸã ESModuleããµããŒãããŠããŸããã
@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-nodeã®ä»£ããã«@ babel / registerã䜿çšãããšããã©ã€ãã©ãªã®æ°ããèšå®ã«èå³ããããŸãã
@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)
ïŒLodashã®äœæè
ããã®ïŒé©ãã¹ããesmãã¢ãžã¥ãŒã«ãçºèŠããã®ã§ãBabelãé¢äžããå¿
èŠãããããŸããã æ¬åœã«ãã¹ãŠã®KnexãES6ã¢ãžã¥ãŒã«ããµããŒãããå¿
èŠãããã®ã¯ãéåžžã«ç°¡åã§ãèå°è£ã§--require esm
ãnode
ã«æž¡ãæ¹æ³ã«ãããŸããã
knex
ã³ãã³ãã©ã€ã³ãåã«-r
ãåãåã£ãŠããŒãã«æž¡ãããšãã§ããã°ããã®ãã±ããã ãã§ãªãã誰ããKnexãå®è¡ããåã«ããŒãã¢ãžã¥ãŒã«ãå®è¡ããå¿
èŠãããä»ã®åé¡ã解決ããŸãã
-ç·šé-
-r
åŒæ°ãååšãããŸã§ã次ã®ããã«ããŠããã¹ãŠã®_required_ã¢ãžã¥ãŒã«ã§ES6æ§æã䜿çšã§ããŸãïŒãã ãã 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ãããŒã> 12ã§åäœã§ããããã«ããããã®è²¢ç®ãæ€èšããããšæããŸãã Nodeã§ESMã䜿çšããçµéšãå°ãããã®ã§ããããã¹ã ãŒãºã«é²ãããšãé¡ã£ãŠããŸãã æ®å¿µãªãããç§ã¯å€åæéäžã«ããã«åãçµãããšãã§ããªãã®ã§ããã€ãããå§ããããšãã§ããããããªãã«èšãããšãã§ããŸããïŒããžãã¹é¢é£ã§ã¯ãããŸããïŒã ãŸããknexã³ãŒãããŒã¹ã«æ £ããã®ã«1åããããŸã
ã©ã€ãã©ãªã®äœæè
ãæ°ããäŸåé¢ä¿ã«åé¡ããªããã°ãæ°ããè¡ã«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ã®ãµããŒããä¿®æ£ããããããããã«å€æŽãå ããåã«ãäœãæ©èœããäœãæ©èœããªãããç解ããããã®ãã¹ããäœæãããšäŸ¿å©ã§ãã
ãšã¯èšããã®ã®ã誰ããããããã¹ãŠã調æ»ãããŸã å¿
èŠãªäœæ¥ïŒããå ŽåïŒã決å®ããããã€ãã®ãã¹ãã«è²¢ç®ããå Žåãããã¯éåžžã«åœ¹ç«ã¡ãŸãã
ãããçããã¯ãŸã å®å šã«ãã€ã¯ãããŠããªãå ¬åŒã®ããŒããœãªã¥ãŒã·ã§ã³ã䜿çšããŸããã
IMHOã®ãesmãã¢ãžã¥ãŒã«ãœãªã¥ãŒã·ã§ã³ã¯ã¯ããã«åçŽã§ãç¹å¥ãªãã©ã°ã¯å¿ èŠãããŸããããã¹ãŠã®ããŒãç°å¢ã§ãã©ã€ãã©ãªESã¢ãžã¥ãŒã«ããã¹ãŠã®äººã«ãšã£ãŠäœ¿ãããããã®ã«ããã ãã§ãïŒç§ãèšã£ãããã«ãå¿ èŠãªè¡ã¯1ã€ã ãã§ããå¯èœæ§ãé«ãã§ãïŒã ã
Lodashãäœã£ã人ããã§ãã JDDã¯æºããã
@machineghost https://github.com/knex/knex/pull/3639ã¯babelã䜿çšããŠããã®ã§ãããã¯ãã1ã€ã®æ¹æ³ã§ãã 誰ããesm
ã¢ãžã¥ãŒã«ã¢ãããŒããè©ŠããŠããã®ãèŠããšæããŸãããäœããã®çç±ã§çŸåšPRãèŠã€ããããšãã§ããŸããã
ãããšããã®ã©ã€ãã©ãªãç§ã®çŸåšã®ã¹ã¿ãã¯ãªãŒããŒãããŒãã€ã³ãã®æéã®ãœãŒã¹ã§ããFWIW;ïŒ
ç§ã¯ãããçºèŠããããã§ä»ã®äººã«ããããå§ãããŸããïŒ https ïŒ
ãããŠä»ãç§ã¯æ°æ¥ããšã«æ°ããè³æ祚ãåãåããŸãããªããªããããã¯æ¬åœã«ESMã«ãšã£ãŠçŽ æŽãããïŒããããä»ã®ãšããæé«ã®ïŒãœãªã¥ãŒã·ã§ã³ã ããã§ãã
@machineghostãã®å°å ¥ãæ¢åã®ã³ãŒãããŒã¹ã«åºã¥ããŠãããšã©ã®
ããã¯ãäœã®å¹æããªãã¯ãã§ããã確å®ã«ãã¹ãããªããã°ãªããªããã¹ãŠã«åœ±é¿ããã®ã§ãã®ååŒã®1ã€ã ãšæããŸãã
ç§ã¯ãã®å éšãèŠãŠããŸããããã³ãã¥ããã£ã§ã®ãã®ãããžã§ã¯ãã®ãããã¡ã€ã«ãèãããšããããã誰ãã@jdaltonã«å°ããå Žåã圌ã¯ãªã¹ã¯ãã¯ããã«å€ãã®æ å ±ã«åºã¥ããæèŠã§ïŒïŒïŒcrossed_fingersïŒ
@machineghost https://github.com/knex/knex/pull/3616ãèŠãŠãå
ã®å®è£
ã®åœ±é¿ã確èªã§ããŸãã esm
ãå°å
¥ãããå Žåããããããããåé€ãŸãã¯äº€æããå¿
èŠããããŸãã
垯åå¹ ATMã¯ãããŸããããæéãããã°èŠãŠãããŸãã ãããã@jhechtfã¯ãã£ãšæ©ãã§ãããããããŸãããïŒ
ãããçããã¯ãŸã å®å šã«ãã€ã¯ãããŠããªãå ¬åŒã®ããŒããœãªã¥ãŒã·ã§ã³ã䜿çšããŸããã
@machineghost ïŒããŒã... --esm
ãã©ã°ã¯å®éã«ããªããèšåããesm
ã¢ãžã¥ãŒã«ã䜿çšããŠãããšæããŸãïŒ
https://github.com/knex/knex/blob/0f523db957138cc0423723c699c9ce52db5feb14/bin/cli.js#L52 -L55
é¢é£ããã¡ã¢ïŒ Liftoff
æ©èœåŒ·åãããŒãžãããåŸã --require
ãã©ã°ãä¿®æ£ããã€ããã ã£ãããšãæãåºããŸããã ç§ã¯ä»ããããã«è¡ããªããã°ãªããŸãã...
ããããè©«ã³ããŸãïŒ ã¹ãã£ã³ãéãããŠãã node ${KNEX} --esm
ãã衚瀺ãããããã§å€æ°ã確èªãããšãããããŒãã«åŒæ°ãçŽæ¥æž¡ããŠãããŒãã®ããŒãžã§ã³ã䜿çšããããã«æ瀺ããŠãããšæããŸããã
ããã¯ãã§ã«è§£æ±ºãããŠããããã§ãããåé¡ã®ã¹ã¬ããããã¯æããã§ã¯ãããŸããã§ããã ããä»äºïŒ+1ïŒ
npïŒ ãã®PRã§ã¯@ D10221ã«ãã£ãŠæ©èœãè¿œå ãããããã§ãã
https://github.com/knex/knex/pull/3616
ã ããã圌ãã¯ä¿¡çšã«å€ããð
æãåèã«ãªãã³ã¡ã³ã
@jeremejevsè¯ãã¢ã€ãã¢...ãš
ããªãã¯ããããã®ããã«äœ¿ãããšãã§ããŸã
ãã¹ãŠã®Knexã³ãã³ãçšã«åå¥ã®ã¹ã¯ãªãããäœæããå¿ èŠã¯ãããŸããã