使用Node.JS中的绝对路径创建相对符号链接

时间:2015-04-21 16:03:58

标签: node.js symlink

我有一个具有以下结构的项目:

project-root
├── some-dir
│   ├── alice.json
│   ├── bob.json
│   └── dave.json
└── ...

我想创建符合以下内容的符号链接:

  • foo - > alice.json

我选择使用fs.symlink功能:

  

fs.symlink(srcpath, dstpath[, type], callback)

     

异步符号链接(2)。除了可能的异常之外,没有给完成回调的参数。 type参数可以设置为'dir''file''junction'(默认为'file'),仅在Windows上可用(在其他平台上忽略) 。请注意,Windows联结点要求目标路径是绝对路径。使用'junction'时,destination参数将自动标准化为绝对路径。

所以,我做了:

require("fs").symlink(
  projectRoot + "/some-dir/alice.json"
, projectRoot + "/some-dir/foo"
, function (err) { console.log(err || "Done."); }
);

这将创建foo符号链接。但是,由于路径是绝对的,因此符号链接也使用绝对路径。

如何创建相对于目录的符号链接路径(在本例中为some-dir)?

这将防止在重命名父目录或在另一台计算机上移动项目时出错。

我看到的脏选择是使用exec("ln -s alice.json foo", { cwd: pathToSomeDir }, callback);,但我想避免这种情况并使用NodeJS API。

那么,如何在NodeJS中使用绝对路径创建相对符号链接?

2 个答案:

答案 0 :(得分:10)

选项1:使用process.chdir()将流程的当前工作目录更改为projectRoot。然后,提供fs.symlink()的相对路径。

选项2:使用path.relative()或以其他方式生成符号链接与其目标之间的相对路径。将该相对路径作为第一个参数传递给fs.symlink(),同时为第二个参数提供绝对路径。例如:

var relativePath = path.relative('/some-dir', '/some-dir/alice.json');
fs.symlink(relativePath, '/some-dir/foo', callback);

答案 1 :(得分:0)

const path = require('path');
const fs = require('fs');

// The actual symlink entity in the file system
const source = /* absolute path of source */;

// Where the symlink should point to
const absolute_target = /* absolute path of target */;

const target = path.relative(
    path.dirname(source),
    absolute_target
);

fs.symlink(
    target,   
    source,
    (err) => {

    }
);