MAC node升降级,gitbook/Node.js文件拷贝

事情源于之前写的两个gitbook插件都用到文件拷贝功能,当时偷懒直接使用exec,导致window环境下执行linux命令出错,为了解决这个问题,想到两种思路:
1. 判断当前操作系统类型,再调用响应的命令;
2. 使用Node.js内置的对象方法实现文件拷贝;

两个思路执行历程:
思路一,google了N久,只找到了在浏览器环境下的判断方法,如https://www.cnblogs.com/daipianpian/p/5836576.html,然而其中用到的navigator对象似乎是在浏览器环境下使用的,遂放弃;
思路二,在vscode里面直接打fs.然后跳出来的方法中有个copyFile(),欣喜了一下,然后编译的时候提示
TypeError: fs.copyFile is not a function
又google了一下,原来是新版的Node.js才新增的功能。
二话不说,立马先把Node.js升级到最新版,使用了这个方法:

第一步,先查看本机node.js版本:
$ node -v
第二步,清除node.js的cache:
$ sudo npm cache clean -f
第三步,安装 n 工具,这个工具是专门用来管理node.js版本的,别怀疑这个工具的名字,是他是他就是他,他的名字就是 “n”
$ sudo npm install -g n
第四步,安装最新版本的node.js
$ sudo n stable
第五步,再次查看本机的node.js版本:
$ node -v

然后按着操作直接把Node.js从v6.14.3升级到了v10.6.0,然后编译的时候报错:

Error loading version latest: Error: Cannot find module 'internal/util/types'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    ...

好吧,本来想偷懒一下(作为一个插件,要求别人全都升级到最新版的Node.js显然不合理),看来还得自己实现一个多操作系统兼容的文件拷贝函数了。
所以Node.js也得恢复到原版,恢复的方法很简单:
sudo n 6

同时也google到很多人很早之前就在找JS的文件复制功能了,比如https://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js

经过筛选测试后,选用这个;

Features:

  • If the dst folders do not exist, it will automatically create it. The other answer will only throw errors.
  • It returns a promise, which makes it easier to use in a larger project.
  • It allows you to copy multiple files, and the promise will be done when all of them are copied.

Usage:

var onePromise = copyFilePromise("src.txt", "dst.txt");
var anotherPromise = copyMultiFilePromise(new Array(new Array("src1.txt", "dst1.txt"), new Array("src2.txt", "dst2.txt")));

Code:

function copyFile(source, target, cb) {
    console.log("CopyFile", source, target);

    var ensureDirectoryExistence = function (filePath) {
        var dirname = path.dirname(filePath);
        if (fs.existsSync(dirname)) {
            return true;
        }
        ensureDirectoryExistence(dirname);
        fs.mkdirSync(dirname);
    }
    ensureDirectoryExistence(target);

    var cbCalled = false;
    var rd = fs.createReadStream(source);
    rd.on("error", function (err) {
        done(err);
    });
    var wr = fs.createWriteStream(target);
    wr.on("error", function (err) {
        done(err);
    });
    wr.on("close", function (ex) {
        done();
    });
    rd.pipe(wr);
    function done(err) {
        if (!cbCalled) {
            cb(err);
            cbCalled = true;
        }
    }
}

function copyFilePromise(source, target) {
    return new Promise(function (accept, reject) {
        copyFile(source, target, function (data) {
            if (data === undefined) {
                accept();
            } else {
                reject(data);
            }
        });
    });
}

function copyMultiFilePromise(srcTgtPairArr) {
    var copyFilePromiseArr = new Array();
    srcTgtPairArr.forEach(function (srcTgtPair) {
        copyFilePromiseArr.push(copyFilePromise(srcTgtPair[0], srcTgtPair[1]));
    });
    return Promise.all(copyFilePromiseArr);
}

你可能感兴趣的:(LINUX)