1

我需要将迁移文件夹的路径传递给 Umzug 配置,但它正在被 webpack 压缩,可以吗?

我尝试单独捆绑每个迁移文件,但 Umzug 说它找不到方法up()

    let umzug = new Umzug({
      storage: 'sequelize',

      storageOptions: {
        sequelize: sequelize
      },

      migrations: {
        params: [
          sequelize.getQueryInterface(),
          Sequelize
        ],
        path: './../db/migrations/*')
      }
    })

当我尝试手动运行它们时,它们只是从 webpack 编译而来,它说没有方法up()

4

1 回答 1

4

自从你 7 个月前问过这个问题以来,我可能迟到了一点,但我刚刚遇到了同样的问题,所以我想我会发布我的解决方案。

我通过在 Webpack 中为每次迁移创建一个入口点来解决这个问题。我曾经glob动态地获取文件,然后将它们附加到入口点参数,使用文件名作为入口点名称。

然后在output.filename函数中,我检查之前列表中的任何入口点。然后在一个migrations目录中创建这些入口点文件,以保持它们干净地放置在我的其余入口点文件之外,以便您的迁移器也不会尝试迭代它们。

webpack.config.js

const migrationFiles = glob.sync('./src/migrations/*');
const migrationEntries = migrationFiles.reduce((acc, migrationFile) => {
    const entryName = migrationFile.substring(
        migrationFile.lastIndexOf('/') + 1,
        migrationFile.lastIndexOf('.')
    );
    acc[entryName] = migrationFile;
    return acc;
}, {});

modules.exports {
    entry: {
        index: './src/index.ts',
        ...migrationEntries,
    },

    ...

    output: {
        libraryTarget: 'commonjs',
        filename: chunkData => {
            if (Object.keys(migrationEntries).includes(chunkData.chunk.id)) {
                return `migrations/${chunkData.chunk.id}.js`;
            }

            return '[name].js';
        },
    },
}

现在,您的所有迁移都应该可以作为目录.js中的文件直接访问/dist/migrations

现在加载 Umzug,你可以指定迁移目录路径

let umzug = new Umzug({
    storage: 'sequelize',

    storageOptions: {
        sequelize: sequelize
    },

    migrations: {
        params: [
            sequelize.getQueryInterface(),
            Sequelize
        ],
        path: path.join(__dirname, 'migrations')
    }
})

我确信那里有更好的解决方案,但是这个解决方案花费的时间比我想承认的要长,并且解决了我所有的问题,所以这就是我结束搜索的地方。希望这可以帮助某人。

于 2020-04-14T23:26:45.493 回答