0

我有这两个 Gulp 任务:

function changeAPIEnvDirectoryForProd() {
    return src('src/app/modules/models/ApiUrl.ts', { base: "src/app/modules/models/" })
    .pipe(replace('../../../environments/environment', '../environments/environment')).pipe(
        dest('src/app/modules/models/', {overwrite: true})
    );
}

function changeAPIEnvDirectoryForLocal() {
    return src('src/app/modules/models/ApiUrl.ts', { base: "src/app/modules/models/" })
    .pipe(replace('../environments/environment', '../../../environments/environment')).pipe(
        dest('src/app/modules/models/', {overwrite: true})
    );
}

两者都根据环境运行,一个用于生产,另一个用于本地开发。

我遇到的问题是,如果在我的文件中有:

import { environment } from '../../../environments/environment'

export class Apis {
    static bo = `${environment.boAPIUrl}/api/v1/bo`;
}

当我运行changeAPIEnvDirectoryForLocal任务时,它将以前的代码替换为:

import { environment } from '../../../../../environments/environment'

这是因为根据我的代码,它应该保持不变。我认为问题在于替换搜索这两个字符串是相同的:

../../../environments/environment

../environments/environment

无论如何要指定精确匹配吗?

4

1 回答 1

0

最简单的方法是'在搜索词中包含 's,如下所示:

.pipe(replace("'../environments/environment'", '../../../environments/environment'))

现在它将只查找完整的术语。在搜索词的开头和结尾包含转义'的 so 语气似乎也有效:'

.pipe(replace('\'../environments/environment\'', '../../../environments/environment'))

顺便说一句,您的结果是预期的,gulp-replace 会'../environments/environment在其中找到,../../../../../environments/environment因为它就在那里。

最后,您可以使用正则表达式以积极的方式来解决您的问题。如

.pipe(replace(/(?<=')..\/..\/..\/environments\/environment/g, '../../../environments/environment'))

(在正则表达式中,您的路径分隔符必须被转义)

于 2019-10-08T20:55:45.393 回答