如何使用 gulp 从以下配置自动构建
How to automate the build from the following configuration using gulp
背景
我有一个 loopback 和 Angular 应用程序,Loopback 使用服务器模型和 api 并使用它的 sdk 我们可以获得客户端服务。
现在我计划使用 gulp 自动执行以下构建过程。
如果对模型进行了任何更改,则 sdk 命令为 运行 并且服务器也会重新启动/其次,当对 angular 文件进行任何更改时,sdk 文件为 运行 并且文件为从 angular dist 文件夹中获取并重新启动服务器,最好我们可以使用浏览器的实时重新加载。
这是我尝试过的方法,这似乎从来没有奏效,我已经为此工作了好几天。
更新
我能够将大部分内容自动化,但失败的地方是
gulp.task('browser-sync', function() {
browserSync.init(null, {
proxy: 'http://localhost:3000/home',
browser: 'google chrome',
port: 7000,
});
gulp.watch(['client/src/app/*.ts'], browserSync.reload);
let watcher = gulp.watch(['./common/models/**.js', './server/**.js', 'gulpfile.js'], ['sdk', 'server']);
watcher.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); // this watcher
});
});
gulp.task('sdk', function() {
spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q'], {stdio: 'inherit'});
});
此观察者重新启动服务器并 运行s sdk 但它在 sdk 中失败
堆栈跟踪请帮忙
via remoting. The Angular code for this scope won't be generated.
[19:29:37] Starting 'sdk'...
[19:29:37] Finished 'sdk' after 11 ms
[19:29:37] Starting 'server'...
[19:29:37] Finished 'server' after 17 ms
events.js:163
throw er; // Unhandled 'error' event
^
Error: spawn ./node_modules/.bin/lb-sdk ENOENT
at exports._errnoException (util.js:1050:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
at onErrorNT (internal/child_process.js:367:16)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickCallback (internal/process/next_tick.js:104:9)
更新
我有多个 gulp 任务,其中一个是 ng build -w
,它发生在一个新目录中,我更改了 process.chdir
以更改路径,我也保留了这个标签sdk 所以我需要再次检查她的路径。我如何检查或给出我的 spawn 中的绝对路径。如果这是失败的可能原因之一
- 你确定你 运行
npm install --save-dev @mean-expert/loopback-sdk-builder
?
- 您确定
gulpfile.js
与 package.json
在同一目录中吗?
- 你确定
./node_modules/.bin/lb-sdk
存在吗?
- 您是否尝试过重新安装所有内容?
错误的答案很简单,就是你的 spawn 函数找不到 ./node_modules/.bin/lb-sdk
。这要么是因为该文件不存在,要么是因为找不到它 相对于您的 gulpfile.js
控制台中的 ENOENT 错误意味着 "error: no entity"。它来自 UNIX,而不是 Node 本身,基本上只是翻译成 "file not found",但适用于各种通用的东西,而不仅仅是 files/directories.
检查文件 ./node_modules/.bin/lb-sdk
确实存在。然后检查你的 gulpfile 是否在相对于该目录的根目录中。
考虑到您的更新
可能发生的情况是,一旦您使用 process.chdir
更改目录以执行单独的任务,并且您一直在监视所有任务。路径设置为之前的路径,gulp 任务无法在相应路径中找到 sdk i:e spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q'], {stdio: 'inherit'});
。
要解决此问题,您可以在 sdk task
中添加以下检查
gulp.task('sdk', function() {
if (process.cwd() != __dirname) { // this checks for the current path
process.chdir(<change path>); // if it dosent match your base path change it here
}
spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q'], {stdio: 'inherit'});
});
背景
我有一个 loopback 和 Angular 应用程序,Loopback 使用服务器模型和 api 并使用它的 sdk 我们可以获得客户端服务。
现在我计划使用 gulp 自动执行以下构建过程。 如果对模型进行了任何更改,则 sdk 命令为 运行 并且服务器也会重新启动/其次,当对 angular 文件进行任何更改时,sdk 文件为 运行 并且文件为从 angular dist 文件夹中获取并重新启动服务器,最好我们可以使用浏览器的实时重新加载。
这是我尝试过的方法,这似乎从来没有奏效,我已经为此工作了好几天。
更新
我能够将大部分内容自动化,但失败的地方是
gulp.task('browser-sync', function() {
browserSync.init(null, {
proxy: 'http://localhost:3000/home',
browser: 'google chrome',
port: 7000,
});
gulp.watch(['client/src/app/*.ts'], browserSync.reload);
let watcher = gulp.watch(['./common/models/**.js', './server/**.js', 'gulpfile.js'], ['sdk', 'server']);
watcher.on('change', function(event) {
console.log('File ' + event.path + ' was ' + event.type + ', running tasks...'); // this watcher
});
});
gulp.task('sdk', function() {
spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q'], {stdio: 'inherit'});
});
此观察者重新启动服务器并 运行s sdk 但它在 sdk 中失败
堆栈跟踪请帮忙
via remoting. The Angular code for this scope won't be generated.
[19:29:37] Starting 'sdk'...
[19:29:37] Finished 'sdk' after 11 ms
[19:29:37] Starting 'server'...
[19:29:37] Finished 'server' after 17 ms
events.js:163
throw er; // Unhandled 'error' event
^
Error: spawn ./node_modules/.bin/lb-sdk ENOENT
at exports._errnoException (util.js:1050:11)
at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
at onErrorNT (internal/child_process.js:367:16)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickCallback (internal/process/next_tick.js:104:9)
更新
我有多个 gulp 任务,其中一个是 ng build -w
,它发生在一个新目录中,我更改了 process.chdir
以更改路径,我也保留了这个标签sdk 所以我需要再次检查她的路径。我如何检查或给出我的 spawn 中的绝对路径。如果这是失败的可能原因之一
- 你确定你 运行
npm install --save-dev @mean-expert/loopback-sdk-builder
? - 您确定
gulpfile.js
与package.json
在同一目录中吗? - 你确定
./node_modules/.bin/lb-sdk
存在吗? - 您是否尝试过重新安装所有内容?
错误的答案很简单,就是你的 spawn 函数找不到 ./node_modules/.bin/lb-sdk
。这要么是因为该文件不存在,要么是因为找不到它 相对于您的 gulpfile.js
控制台中的 ENOENT 错误意味着 "error: no entity"。它来自 UNIX,而不是 Node 本身,基本上只是翻译成 "file not found",但适用于各种通用的东西,而不仅仅是 files/directories.
检查文件 ./node_modules/.bin/lb-sdk
确实存在。然后检查你的 gulpfile 是否在相对于该目录的根目录中。
考虑到您的更新
可能发生的情况是,一旦您使用 process.chdir
更改目录以执行单独的任务,并且您一直在监视所有任务。路径设置为之前的路径,gulp 任务无法在相应路径中找到 sdk i:e spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q'], {stdio: 'inherit'});
。
要解决此问题,您可以在 sdk task
gulp.task('sdk', function() {
if (process.cwd() != __dirname) { // this checks for the current path
process.chdir(<change path>); // if it dosent match your base path change it here
}
spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q'], {stdio: 'inherit'});
});