次の構造のプロジェクトがあります。
_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で絶対パスを使用して相対シンボリックリンクを作成するにはどうすればよいですか?
オプション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);
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) => {
}
);