سيكون من الرائع لو كان knex cli يدعم es6 للتهيئة والترحيل. ربما يكون هذا خلف علامة أو فقط عندما يكون هناك ملف .babelrc
في دليل العمل الحالي.
بالتأكيد سيكون هذا رائعا. سعيد لقبول العلاقات العامة لهذا الشخص.
آسف. كان من المفترض أن يكون التعليق السابق على الإصدار 1220 ، لكني وضعت هذا التعليق عن طريق الخطأ هنا.
@ rhys-vdw هل تعرف ما الذي سيستغرقه الأمر؟
تضمين التغريدة أنا مهتم حقًا بمتابعة هذا أيضًا لأنني أجد أن هذه ستكون ميزة رائعة حقًا. هل تعتقد أنه يمكنك توجيهنا إلى المكونات التي يجب أن نستكشفها لمحاولة جعل هذا الأمر ممكنًا. سوف تساعد بعض البصيرة
قد تعمل إضافة require("babel-register")
إلى نقطة دخول CLI.
تم التأكيد - تمت إضافة ذلك إلى ملف البذور الخاص بي وتشغيل ES2015! ربما يجب أن يكون خيارًا في knexfile.js
لتعيين compiler
، مثلما يفعل mocha مع 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"]
}
}
}
ومع ذلك ، لا يمكنني تغيير مسار البذور ، عندما لا تكون موجودة في. / البذور التي سأحصل عليها دائمًا
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 " في حال نسيت الصياغة الدقيقة بعد نصف عام (هل كانت "إنشاء"؟ أم "ترحيل"؟ أو "ترحيل: جعل "؟ أو" الهجرة: جديد "؟ أو ...) 🙂
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 يهاجر الغزل
""
أي مؤشرات؟ يبدو أنه مجرد قضية عمل دير (أعتقد) 🤔
haywirez هل أنت متأكد من أن هذا مرتبط بموضوع هذه التذكرة؟ .. على أي حال ، حاول فعل ما تطلبه بالضبط ، أضف --knexfile الذي من شأنه أن يشير إلى knexfile.js
من المحتمل أن تكون مشكلة export default { ... }
يجب أن يكون const file = require('/path/to/knexfile').default
لإمكانية التشغيل المتداخل ESM.
أيضًا ، يسمح Liftoff ، كما هو مستخدم في knex cli ، بعلم --require
لطلب شيء مثل esm
أو babel-register
. لسوء الحظ ، نظرًا لعدم تسجيل هذا الأمر في Commander ، يموت knex cli بعد طلب esm
:
± |master ?:18 ✗| → npx knex --require esm seed:make admin_user
Requiring external module esm
error: unknown option `--require'
هل سيكون المشروع مفتوحًا للعلاقات العامة لتمكين --require
على جميع الأوامر بالإضافة إلى ضمان التشغيل المتداخل على knexfile
؟
https://github.com/tgriesser/knex/issues/1232#issuecomment -411775132 سيسمح لك أيضًا بتسجيل مسارات tsconfg لأسماء مسار الاسم المستعار ، وهو أمر مفيد عند صنع البذور مع كتابة مطبوعة. لا تخطط 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 ، فجرّب ما يلي:
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')
مثل السطر الجديد ... إذا كان مؤلفو المكتبة موافقين على التبعية الجديدة.
jhechtfmachineghost التحقق من ذلك:
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 للمكتبة مناسبة للجميع ، في جميع ضواحي Node (من المحتمل جدًا مع سطر طلب واحد فقط ، كما قلت) .
إنه من الرجل الذي صنع لوداش ؛ صخور JDD.
machineghost https://github.com/knex/knex/pull/3639 يستخدم بابل ، لذلك هذه طريقة أخرى. أعتقد أنني رأيت شخصًا يحاول استخدام نهج الوحدة النمطية esm
، لكن لسبب ما لا يمكنه العثور على العلاقات العامة الآن.
حسنًا ، FWIW هذه المكتبة هي أسرع مصدر حالي لنقاط Stack Overflow ؛)
اكتشفت أنه، وأوصى به للآخرين هنا: https://stackoverflow.com/questions/47277887/node-experimental-modules-requested-module-does-not-provide-an-export-named/54302557#54302557
والآن أحصل على تصويت جديد كل بضعة أيام لأنه حل رائع (يمكن القول إنه الأفضل حاليًا) لـ ESM.
machineghost إلى أي مدى تتوقع أن يكون مقدمته مستندة إلى قاعدة التعليمات البرمجية الموجودة؟
أعتقد أن هذه واحدة من هذه الصفقات "لا ينبغي أن يكون لها أي تأثير على الإطلاق ، ولكن نظرًا لأنها تؤثر على كل ما عليك اختباره للتأكد من" الصفقات.
أنا لم ينظر في الداخلية، ولكن نظرا لمحة من هذا المشروع في المجتمع، وربما إذا سأل أحدهمjdalton انه قد تزن في على المخاطر (مع رأي أكثر استنارة بكثير من الألغام؟): crossed_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:
np! يبدو أنه تمت إضافة الميزة بواسطة @ D10221 في هذا PR:
https://github.com/knex/knex/pull/3616
لذا فهم يستحقون الفضل 🎉
التعليق الأكثر فائدة
jeremejevs فكرة جيدة ... مع
يمكنك استخدامه بهذه الطريقة
دون الحاجة إلى إنشاء برنامج نصي منفصل لجميع أوامر Knex.