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

使用Node.JS中的绝对路径创建相对符号链接,node.js,symlink,Node.js,Symlink,我有一个具有以下结构的项目: project-root ├── some-dir │   ├── alice.json │   ├── bob.json │   └── dave.json └── ... 我想创建如下符号链接: foo->alice.json 我选择使用该功能: fs.symlink(srcpath,dstpath[,type],callback) 异步符号链接(2)。除了可能的异常之外,没有为完成回调提供任何参数。类型参数可以设置为'dir','file'或'junct

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

project-root
├── some-dir
│   ├── alice.json
│   ├── bob.json
│   └── dave.json
└── ...
我想创建如下符号链接:

  • foo
    ->
    alice.json
我选择使用该功能:

fs.symlink(srcpath,dstpath[,type],callback)
异步符号链接(2)。除了可能的异常之外,没有为完成回调提供任何参数。
类型
参数可以设置为
'dir'
'file'
'junction'
(默认值为
'file'
),并且仅在Windows上可用(在其他平台上被忽略)。请注意,Windows连接点要求目标路径为绝对路径。使用
'junction'
时,目标参数将自动规范化为绝对路径

所以,我做到了:

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),但我希望避免这种情况,并使用nodejsapi


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

选项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);

在这种情况下,您是否希望整个过程都将
projectRoot
作为工作目录?是和否-将其用作命令行工具很好,但我开发的这个工具也可以用作库。这就是为什么我不喜欢设置
进程的当前工作目录的原因。好的,另一种选择是使用
path.relative()
。将编辑我的答案。第二个解决方案看起来更好。你能不能也添加一个例子?哎呀,我在例子代码中有一个小错误。刚刚更新过。
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) => {

    }
);