【问题标题】:Gulp replace not renaming files but does replace file contentsGulp 替换不重命名文件但替换文件内容
【发布时间】:2019-09-13 10:27:19
【问题描述】:

我有以下 gulp 任务,我想更改文件的文件名和内容,用替换替换任何匹配的字符串。

文件内容中的匹配字符串会更改,但文件名不会。我认为它会因为我的代码似乎与 https://www.npmjs.com/package/gulp-replace 上的示例匹配

我做错了什么?

function renameFileContents() {

  return gulp.src([
    '**/*',
    '!.github/**',
    '!languages/**',
    '!node_modules/**',
    '!.babelrc',
    '!.editconfig',
    '!.gitignore',
    '!.travis.yml',
    '!CHANGELOG.md',
    '!codesniffer.ruleset.xml',
    '!composer.json',
    '!composer.lock',
    '!config.yml',
    '!config-default.yml',
    '!gulpfile.babel.js',
    '!MIT-LICENSE.txt',
    '!package-lock.json',
    '!package.json',
    '!phpunit.xml.dist',
    '!README.md',
    '!webpack.config.js'
  ])
    .pipe($.replace('BigTest', 'Tester'))
    .pipe($.replace('Bigtest', 'Tester'))
    .pipe($.replace('bigtest', 'tester'))
    .pipe(gulp.dest('./'));

}

【问题讨论】:

  • 你想替换哪些文件名,应该用什么替换?
  • 不在排除列表中的每个文件并替换代码中 .replace 行中显示的 3 个字符串。
  • .src.dest gulp 之间使用自己的文件系统,你需要类似gulp-rename

标签: javascript gulp gruntjs


【解决方案1】:

使用gulp-rename 更改文件名。添加:

const rename = require('gulp-rename');

之前.pipe(gulp.dest('./'));:

.pipe(
    rename(function(path) {
        path.basename = path.basename.replace(/BigTest|Bigtest|bigtest/, function(matched) {
            return { BigTest: 'Tester', Bigtest: 'Tester', bigtest: 'tester' }[matched];
        });
    })
)

【讨论】:

  • 啊——快到了。我现在有重复的文件,新旧名称,这似乎是创建新文件而不是修改现有文件的名称?
【解决方案2】:

您在评论中询问为什么创建新文件(使用新名称)但原始文件仍然存在。为什么 gulp-rename 实际上并没有像您期望的那样重命名原始文件?

Gulp-rename 不适用于原始文件。这可能有点令人困惑。

之所以称为 gulp-rename,是因为它重命名了一个 内存中的 gulp 文件 对象。 gulp 就像函数式编程,每个插件都接受 在内存中输入并产生输出,而不会产生副作用。 [强调]


gulp 是这样工作的:

  • 读取文件(gulp.src)
  • 做一些事情,修改内存中的文件(插件)
  • 将文件更改提交回 fs(gulp.dest/或其他)

来自gulp-rename issues: not renaming the original files

我测试的建议修复(来自gulp recipes: deleting files from a pipeline)是:

const del = require('del');
const vinylPaths = require('vinyl-paths');

并在replace 管道之前添加这个pipe

.pipe(vinylPaths(del))

.pipe(
  rename(function(path) { ......

您的原始文件将被删除,只留下新命名的文件。显然,在删除任何文件之前,请确保在良好的测试用例上进行测试!

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2012-01-25
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多