我将 gulpfile.js 切成几个文件。我的目的是与各种任务共享数据。我使用Windows系统,gulp 5和“type”:“module”配置。
文件结构如下:
gulpfile.js
tasks/clean.js
tasks/deploy_data.js
data/path.js
data/other.js
gulpfile.js
import gulp from 'gulp';
import clean from './tasks/clean.js';
import deploy_data from './data/deploy_data.js';
global.data = {}; // share data with all tasks.
function deploy_at_start() {
gulp.series(deploy_data);
}
deploy_at_start(); // I hope that deploy_data will be executed before any task I debug, because each task needs to use the contents of data.
console.log(data); // {} Blank, obviously deploy_data has not been completed yet, I want the code below to be executed only after it completes.
export {
clean,
// alot of other tasks
};
./tasks/clean.js
function clean(cb) {
console.log(data.path.src); // I need to get some information from data, such as the path I want to delete.
cb();
}
export default clean;
重点是这个
数据/path.js
const path = {
src: './folder/*',
};
export default path;
任务/deploy_data.js
import path from 'node:path';
import { pathToFileURL } from 'node:url';
async function deploy_data(cb) {
const dir = path.join(process.cwd(), 'data');
const files = fs
.readdirSync(dir, { withFileTypes: true }).filter((item) => item.isFile())
.map((item) => item.name); // I have a lot of data files, so this is the easier way to get all the data
for (const file of files) {
data[path.parse(file).name] = (await import(pathToFileURL(path.join(dir, file)).href)).default;
}
cb();
}
export default deploy_data;
当我执行gulp clean时,我无法获取
data.path
信息。我认为这可能是因为 deploy_data
是异步的并且出了问题。
从终端中,我可以看到
deploy_data
在clean完成后完成了它的工作,这就是数据为空的原因。
我知道我可以在clean之前使用gulp.series执行deploy_data,但是我有大量数据。我想我可以通过在
gulpfile.js
开始时执行一次deploy_data来实现目标,类似于当前的方法。
在上述情况下,有没有办法让我在执行任何gulp任务(已导出的任务)之前执行deploy_data并等待其完成后再执行其他代码?
只需添加一个顶级
await
:
await deploy_at_start();
并且不要忘记从
deploy_at_start
返回,这样await
会等待gulp.series()
完成:
function deploy_at_start() {
return gulp.series(deploy_data);
}