Knex: migrate:makeがTypeScriptで失敗する

作成日 2019年01月18日  ·  27コメント  ·  ソース: knex/knex

環境

Knexバージョン:0.16.3(TypeScript knexfileを使用)
データベース+バージョン:PostgreSQL 10.5
OS:Windows 10 Pro64ビット

バグ

knex migrate:make somename 、次のようになります。

Requiring external module ts-node/register
Using environment: development
TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
    at assertPath (path.js:39:11)
    at Object.resolve (path.js:166:7)
    at directories.map.directory (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:82:28)
    at Array.map (<anonymous>)
    at MigrationGenerator._absoluteConfigDirs (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:81:24)
    at MigrationGenerator._ensureFolder (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:41:23)
    at MigrationGenerator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\MigrationGenerator.js:35:17)
    at Migrator.make (X:\Code\node\knextest\node_modules\knex\lib\migrate\Migrator.js:122:27)
    at Command.commander.command.description.option.action (X:\Code\node\knextest\node_modules\knex\bin\cli.js:179:10)
    at Command.listener (X:\Code\node\knextest\node_modules\commander\index.js:315:8)
    at Command.emit (events.js:182:13)
    at Command.parseArgs (X:\Code\node\knextest\node_modules\commander\index.js:654:12)
    at Command.parse (X:\Code\node\knextest\node_modules\commander\index.js:474:21)
    at Liftoff.invoke (X:\Code\node\knextest\node_modules\knex\bin\cli.js:278:13)
    at Liftoff.execute (X:\Code\node\knextest\node_modules\liftoff\index.js:203:12)
    at module.exports (X:\Code\node\knextest\node_modules\flagged-respawn\index.js:51:3)

これは私のknexfile.tsの内容です:

module.exports = {
  development: {
    client: 'pg',
    connection: {
      host: 'localhost',
      database: 'postgres',
      user: 'postgres',
      password: 'pw',
    },
    migrations: {
      directory: 'migrations',
    },
  },
};

いくつかの追加の詳細:

  • knex migrate:make somenameは、knexfile拡張子を.jsに変更すると機能します。 (knex 0.16.3)
  • knex migrate:make somenameは、knex 0.15.1および@types/knex 0.15.1パッケージを使用する場合、TypeScriptknexfileと同じように機能します。
  • 異なるデータベースエンジンやknex0.15.1〜0.16.3のバージョンを試したことはありません。
bug migrations

最も参考になるコメント

また、PostgreSQLサーバーへのクエリの書き込みにはKnexを使用します。 生成する最良の方法は次のとおりであることがわかりました。

  1. 移行ファイルの生成
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. 移行ファイルを実行する
knex migrate:latest --knexfile knexfile.ts 
  1. シードファイルを生成する
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. シードファイルを実行する
knex seed:run --knexfile knexfile.ts 

knexfile.jsを使用する場合、typescriptは構成ファイルの型チェックを提供できないため、 --knexfile knexfile.tsは必要ありません。

全てのコメント27件

これはおそらく関連していると思います: https
0.15.2で動作することは確認できますが、 0.16.xでは動作しません

これはおそらく関連していると思います:#2998
0.15.2で動作することは確認できますが、0.16.xでは動作しません

いいえ、これは別の問題です。 与えられた情報では#2998を再現できないことを確認できます。

自動knexfile解決がknexfile.tsを検索しないように聞こえます。コマンドに--knexfile knexfile.ts引数を渡すか、次のコマンドで移行ジェネレータコマンドに直接パスを指定できます。

knex migrate:make --migrations-directory . -x ts migration-name

ただし、クライアントはknexfile.tsを自動的に検索する必要があると思います。

私は最初にmigrate:latestでこれに気づきました。これは、興味深いことにmigrate:makeは異なるエラーをスローします。 これが両方を見ることができる簡単な再現です: https

また、今日、 knex --knexfile knexfile.ts migrate:make (...)が.tsではなく.jsファイルを作成することに気づきました。 (以前は、knexが自動的にknexfile.tsを取得すると、.tsマイグレーションも自動的に生成されていました)

また、PostgreSQLサーバーへのクエリの書き込みにはKnexを使用します。 生成する最良の方法は次のとおりであることがわかりました。

  1. 移行ファイルの生成
knex migrate:make --knexfile knexfile.ts -x ts <your-migration-name>
  1. 移行ファイルを実行する
knex migrate:latest --knexfile knexfile.ts 
  1. シードファイルを生成する
knex seed:make --knexfile knexfile.ts -x ts <your-seed-name>
  1. シードファイルを実行する
knex seed:run --knexfile knexfile.ts 

knexfile.jsを使用する場合、typescriptは構成ファイルの型チェックを提供できないため、 --knexfile knexfile.tsは必要ありません。

それを修正する計画はありますか? この問題でKnexの採用を増やすことは困難でした:/

@dgadelhaリマインダーをありがとう! 今日か明日見てみます。

これを修正した@ dgadelha0.17.6がリリースされました。 残念ながら、knexfile拡張子から拡張子を解決するための修正は、マスターでのみ利用可能です(今すぐ開始します)。

確認してください!
https://github.com/tgriesser/knex/pull/3282

また、今日、 knex --knexfile knexfile.ts migrate:make (...)が.tsではなく.jsファイルを作成することに気づきました。 (以前は、knexが自動的にknexfile.tsを取得すると、.tsマイグレーションも自動的に生成されていました)

@kibertoad 0.17.6をインストールしたばかりで、Knexfileで「.ts」を指定した場合でもその動作は引き続き発生します。 それらは別々のバグですか?

@mathieumgはい。 数分前に作成し、この号から参照したPRを参照してください:D

@kibertoadやった! 説明は、それがKnexfileと同じ拡張子に基づいて拡張子を推測するためのものであるように聞こえるので、私は確信が持てませんでした。

The description makes it sounds like that was rather for inferring the extension based on the same extension as the Knexfile ->そうですね、明示的に指定されているか自動解決されているかに関係なく、knexfileから拡張子を自動的に推測します。
0.17.6 TSknexfilesの自動解決を修正しました。

よし! extension: "ts"使用した0.17.6でも、「。js」の結果が得られたためです。 それらのバグを修正してくれてありがとう! 😄

拡張子が0.17.6であるため、「ts」でも「.js」の結果が得られます

ああ、あなたは持っているknexfileを持っていることを意味します

{
...
migrations: {
  extension: "ts"
}

初期化? これはhttps://github.com/tgriesser/knex/commit/a65a95bc672563e01c08b40384e1dc2b079ecee1で修正されました
残念ながら、0.17にバックポートされません

0.18.0はまだかなり進んでいますが、コミットに応じてオプションがない場合は、代わりにnext-1をリリースできます。

ねえ、私はPRにコメントしました、どうもありがとう!

@kibertoad素晴らしい、精度に感謝します! 0.18、ストレスなしで待つことができます。 😄

@kibertoad参照するコミットは、直下で定義されている場合にのみ機能します

module.exports = {
  migrations: {
    extension: 'ts';
  }
}

ただし、移行をどこに配置し、どこから読み取るかを定義する移行オブジェクトは、以下で定義する必要があります。

module.exports = {
  [environment]: {
    migrations: {
      directory: './migrations';
    }
}

migrationsオブジェクトを環境オブジェクトの外に移動すると、移行ディレクトリは無視されます。

@ViggoVバグレポートをありがとう! 今日これに対処しようとします。

@ViggoV最新のマスターを試して、今のケースで正しく機能するかどうかを報告できますか?

0.18.0でリリース-next2

申し訳ありませんが、 { ext: 'ts' }切り替えることになりました。これは期待どおりに機能しますが、文書化されていないようです。 時間があるときにテストします

こんにちは私は同じ問題を抱えていました。 このようにknexfile.tsにts-node / registerを要求することを解決しました

`
require( 'ts-node / register')
const s = require( "./ settings.js");
module.exports = {

client: 'pg',
connection: {
  user: s.user,
  host: s.host,
  database: 'starwars',
  password: s.password,
  ssl: true

}
};

`

あなたがすでに問題を解決したかどうかはわかりませんが、私の場合、解決策は非常に簡単でした。 _knexfile.js_をプロジェクトのルートに移動するだけです。 knexをディレクトリ"/ backend"にインストールしましたが、理由がわからないため、ファイルが他のディレクトリに移動しました。 そこで、knexfile.jsを「backend / knexfile.js」に移動し、チャームのように機能します。 誰かのお役に立てば幸いです。

こんにちは@moacirandretti 、私のknexfile.tsはルートプロジェクトにありますが、cli heroku heroku run knex --knexfile knexfile.ts migrate: latest
このメッセージを返します。

Running knex --knexfile knexfile.ts migrate: latest on ⬢ backend-ecolab ... up, run.5056 (Free)
Failed to load external module ts-node / register
Failed to load external module typescript-node / register
Failed to load external module typescript-register
Failed to load external module typescript-require
Failed to load external module sucrase / register / ts
Failed to load external module @ babel / register
Error: Cannot find module 'ts-node / register'
Require stack:
- /app/knexfile.ts
- /app/node_modules/knex/bin/cli.js
    at Function.Module._resolveFilename (internal / modules / cjs / loader.js: 966: 15)
    at Function.Module._load (internal / modules / cjs / loader.js: 842: 27)
    at Module.require (internal / modules / cjs / loader.js: 1026: 19)
    at require (internal / modules / cjs / helpers.js: 72: 18)
    at Object. <anonymous> (/app/knexfile.ts:1:1)
    at Module._compile (internal / modules / cjs / loader.js: 1138: 30)
    at Object.Module._extensions..js (internal / modules / cjs / loader.js: 1158: 10)
    at Module.load (internal / modules / cjs / loader.js: 986: 32)
    at Function.Module._load (internal / modules / cjs / loader.js: 879: 14)
    at Module.require (internal / modules / cjs / loader.js: 1026: 19)

このパッケージts-nodeを開発依存関係にインストールしました

私は同じエラーに直面しました。
knexfile.ts:

import dotenv from "dotenv";
import { Config } from "knex";
dotenv.config();

interface KnexConfig {
  [name: string]: Config;
}

const knexConfig: KnexConfig = {
  development: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST || "127.0.0.1",
      user: process.env.DB_USERNAME || "postgres",
      password: process.env.DB_PASSWRORD || "postgres",
      database: process.env.DB_DEV_NAME || "done_list",
    },
    migrations: {
      directory: "./migrations",
      extension: "ts",
    },
  },
  test: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST || "127.0.0.1",
      user: process.env.DB_USERNAME || "postgres",
      password: process.env.DB_PASSWRORD || "postgres",
      database: process.env.DB_DEV_NAME || "done_list_test",
    },
  },
};

export { knexConfig };

knex migrate:make userを実行するとエラーが発生しましたが、このコメントに記載されているようにknex migrate:make --migrations-directory ./scr/migrations -x ts userを実行するとエラーが発生します。

Typescript: 4.0.2
knex: 0.21.5
@ types / knex: 0.16.1

このページは役に立ちましたか?
0 / 5 - 0 評価