gulp: "TypeError:print不是一个函数"

7

我正在尝试在一个目录中使用gulp构建Semantic-UI,但是我遇到了以下错误:

root@ks4000003:/var/www/mg.guylabbe.ca/web/inc/semantic# gulp build
[10:36:53] Using gulpfile /var/www/clients/client1/web179/web/inc/semantic/gulpfile.js
[10:36:53] Starting 'build'...
Building Semantic
[10:36:53] Starting 'build-javascript'...
Building Javascript
[10:36:54] 'build-javascript' errored after 19 ms
[10:36:54] TypeError: print is not a function
    at Gulp.module.exports (/var/www/clients/client1/web179/web/inc/semantic/tasks/build/javascript.js:64:11)
    at module.exports (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/lib/runTask.js:34:7)
    at Gulp.Orchestrator._runTask (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:273:3)
    at Gulp.Orchestrator._runStep (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:214:10)
    at Gulp.Orchestrator.start (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:134:8)
    at runNextSet (/var/www/clients/client1/web179/web/inc/node_modules/run-sequence/index.js:124:15)
    at runSequence (/var/www/clients/client1/web179/web/inc/node_modules/run-sequence/index.js:136:2)
    at Gulp.module.exports (/var/www/clients/client1/web179/web/inc/semantic/tasks/build.js:49:3)
    at module.exports (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/lib/runTask.js:34:7)
    at Gulp.Orchestrator._runTask (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:273:3)
[10:36:54] 'build' errored after 21 ms
[10:36:54] TypeError in plugin "run-sequence(build-javascript)"
Message:
    print is not a function
Stack:
TypeError: print is not a function
    at Gulp.module.exports (/var/www/clients/client1/web179/web/inc/semantic/tasks/build/javascript.js:64:11)
    at module.exports (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/lib/runTask.js:34:7)
    at Gulp.Orchestrator._runTask (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:273:3)
    at Gulp.Orchestrator._runStep (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:214:10)
    at Gulp.Orchestrator.start (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:134:8)
    at runNextSet (/var/www/clients/client1/web179/web/inc/node_modules/run-sequence/index.js:124:15)
    at runSequence (/var/www/clients/client1/web179/web/inc/node_modules/run-sequence/index.js:136:2)
    at Gulp.module.exports (/var/www/clients/client1/web179/web/inc/semantic/tasks/build.js:49:3)
    at module.exports (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/lib/runTask.js:34:7)
    at Gulp.Orchestrator._runTask (/var/www/clients/client1/web179/web/inc/node_modules/orchestrator/index.js:273:3)

如果我检查javascript.js文件,gulp-print已经正确加载:
var print = require('gulp-print');

并使用(下面第8行):

  // copy source javascript
  gulp.src(source.definitions + '/**/' + globs.components + '.js')
    .pipe(plumber())
    .pipe(flatten())
    .pipe(replace(comments.license.in, comments.license.out))
    .pipe(gulp.dest(output.uncompressed))
    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
    .pipe(print(log.created))
    .pipe(uglify(settings.uglify))
    .pipe(rename(settings.rename.minJS))
    .pipe(gulp.dest(output.compressed))
    .pipe(gulpif(config.hasPermission, chmod(config.permission)))
    .pipe(print(log.created))
    .on('end', function() {
      gulp.start('package compressed js');
      gulp.start('package uncompressed js');
      callback();
    })
  ;

Gulp版本:

[10:42:25] CLI version 3.9.1
[10:42:25] Local version 3.9.1

有人对这个问题有什么想法吗? 谢谢!


1
看起来 gulp-print 可以接受返回字符串的函数。log.created 是一个函数吗?它不能是一个字符串。但如果你想要的话很容易更改。也许这是你错误的根源。 - Mark
谢谢@Mark;即使您的评论并不是对我的问题的直接回答,但这确实鼓励我查找变量(使用console.log()打印它们)。查看gulp-print有助于理解我需要稍微编辑一下代码。我将把解决方案写成答案。尽管如此,这仍然很奇怪,因为这不是自定义脚本。 - guylabbe.ca
1
那个插件非常不标准!请参见 https://github.com/alexgorbatchev/gulp-print/issues/20,以了解用户尝试解决此问题的情况。我没有注意到你的修复方法,因为我从未在gulp插件中遇到过这种情况。 - Mark
我在搜索时没有遇到这个...非常感谢!他们正在使用与我提出的类似的解决方案(可能更好一点,呵呵)。 - guylabbe.ca
2个回答

9

gulpPrint函数是默认导出的,因此,在导入gulp依赖项时需要添加一些代码。将以下代码:

var print        = require('gulp-print');

通过:

var print        = require('gulp-print').default;
// usage
print();

所以 gulpPrint(); 函数被重命名为 print();

或者也可以用以下方式:

var print = require('gulp-print');
// usage
print.default()

如果有疑问,请使用console.log(print)输出变量内容,这将有助于理解逻辑,特别是对于像我这样的初学者。


1
在Semantic UI 2.4.0中,上述更改需要在tasks/build/css.jstasks/build/javascript.js中进行。 - memRistor

3

第一个回答中描述的更改已经在semantic-ui guilpfile.js中。然而,在运行gulp build时我仍然遇到了相同的错误。

原因是gulp-print的旧版本。更新到最新版本后,gulp构建正常:

npm install gulp-print@5.0.0 --save-dev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接