问题:
  1. 使用yarn config set global-folder D:\Yarn\yarn_globalyarn config set cache-folder D:\Yarn\yarn_cache设置yarn的全局安装目录和缓存目录
  2. 使用yarn config list 查看配置结果:
$ yarn config list
yarn config v1.22.4
info yarn config
{
  'version-tag-prefix': 'v',
  'version-git-tag': true,
  'version-commit-hooks': true,
  'version-git-sign': false,
  'version-git-message': 'v%s',
  'init-version': '1.0.0',
  'init-license': 'MIT',
  'save-prefix': '^',
  'bin-links': true,
  'ignore-scripts': false,
  'ignore-optional': false,
  registry: 'https://registry.npmjs.org/',
  'strict-ssl': true,
  'user-agent': 'yarn/1.22.4 npm/? node/v12.22.4 win32 x64',
  'cache-folder': 'D:\\Yarn\\yarn_cache',
  'global-folder': 'D:\\Yarn\\yarn_global'
}
  1. 使用yrm use taobao切换仓库源地址
  2. 再使用yarn config list 查看配置结果:
$ yarn config list
yarn config v1.22.4
info yarn config
{
  'version-tag-prefix': 'v',
  'version-git-tag': true,
  'version-commit-hooks': true,
  'version-git-sign': false,
  'version-git-message': 'v%s',
  'init-version': '1.0.0',
  'init-license': 'MIT',
  'save-prefix': '^',
  'bin-links': true,
  'ignore-scripts': false,
  'ignore-optional': false,
  registry: 'https://registry.npm.taobao.org/',
  'strict-ssl': true,
  'user-agent': 'yarn/1.22.4 npm/? node/v12.22.4 win32 x64',
}
  1. 发现前面配置的global-foldercache-folder不见了
问题分析

找到yrm的安装目录,查看yrm/cli.js文件,发现使用yrm use xxx切换仓库时,是直接往C:\Users\xxx\.yarnrc文件写入配置,代码如下:

function onUse(name) {
    var allRegistries = getAllRegistry();
    if (allRegistries.hasOwnProperty(name)) {
        var registry = allRegistries[name];
		// 注意此处,直接往文件.yarnrc写入,会覆盖掉以前的内容,所以导致其他配置不见了
        fs.writeFile(YARNRC, 'registry "' + registry.registry + '"', function (err) {
            if (err) throw err;
            // console.log('It\'s saved!');

            printMsg([
                '', '   YARN Registry has been set to: ' + registry.registry, ''
            ]);
        });

        // 同时更改npm的源
        npm.load(function (err) {
            if (err) return exit(err);

            npm.commands.config(['set', 'registry', registry.registry], function (err, data) {
                if (err) return exit(err);
                console.log('                        ');
                var newR = npm.config.get('registry');
                printMsg([
                    '', '   NPM Registry has been set to: ' + newR, ''
                ]);
            })
        });
    } else {
        printMsg([
            '', '   Not find registry: ' + name, ''
        ]);
    }
}
解决方案

使用下面的代码替换掉原来的代码

function onUse(name) {
    var allRegistries = getAllRegistry();
    if (allRegistries.hasOwnProperty(name)) {
        var registry = allRegistries[name];
		// 使用以下方式,避免删掉其他配置
        fs.readFile(YARNRC, (err, data) => {
            if (err) throw err;
            let arr = data.toString().replace(/\n/g ,';').split(';');
            let _index = -1;
            arr.find((_item, _i) => {
                if (_item.startsWith('registry')) {
                    _index = _i;
                    return true;
                }
            })
            let _registryStr = 'registry "' + registry.registry + '"';
            if (_index > -1) {
                arr[_index] = _registryStr;
            } else {
                arr.push(_registryStr);
            }
            fs.writeFile(YARNRC, arr.join('\n'), function (err) {
                if (err) throw err;
                console.log('It\'s saved!');
                console.log('registry "' + registry.registry + '"');
                printMsg([
                    '', '   YARN Registry has been set to: ' + registry.registry, ''
                ]);
            });
        });

        // fs.writeFile(YARNRC, 'registry "' + registry.registry + '"', function (err) {
        //   if (err) throw err;
        //    console.log('It\'s saved!');
        //   console.log('registry "' + registry.registry + '"');
        //   printMsg([
        //       '', '   YARN Registry has been set to: ' + registry.registry, ''
        //   ]);
        // });
        // 同时更改npm的源
        npm.load(function (err) {
            if (err) return exit(err);

            npm.commands.config(['set', 'registry', registry.registry], function (err, data) {
                if (err) return exit(err);
                console.log('                        ');
                var newR = npm.config.get('registry');
                printMsg([
                    '', '   NPM Registry has been set to: ' + newR, ''
                ]);
            })
        });
    } else {
        printMsg([
            '', '   Not find registry: ' + name, ''
        ]);
    }
}
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐