web-dev-qa-db-ja.com

Node.JSの絶対パスを使用して相対シンボリックリンクを作成します

次の構造のプロジェクトがあります。

_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'_を使用する場合、宛先引数は自動的に絶対パスに正規化されます。

だから、私はしました:

_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で絶対パスを使用して相対シンボリックリンクを作成するにはどうすればよいですか?

10
Ionică Bizău

オプション1:process.chdir()を使用して、プロセスの現在の作業ディレクトリをprojectRootに変更します。次に、fs.symlink()への相対パスを指定します。

オプション2:path.relative()を使用するか、シンボリックリンクとそのターゲット間の相対パスを生成します。その相対パスを最初の引数としてfs.symlink()に渡し、2番目の引数に絶対パスを指定します。例えば:

var relativePath = path.relative('/some-dir', '/some-dir/alice.json');
fs.symlink(relativePath, '/some-dir/foo', callback);
10
Trott
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) => {

    }
);
0
Bryan Grace