Ошибка относительного пути при выполнении сценария Node из другой папки - PullRequest
2 голосов
/ 05 ноября 2019

У меня есть этот скрипт, который мне нужно запустить с node через CLI.

И этот скрипт имеет относительную ссылку на файл как:

files: '../functions/index.js',

Структура файлапримерно так:

> buildScripts
    myScript.js
> functions
    index.js

Когда я нахожусь в папке buildScripts (на терминале), все работает:

>> C:\MyProjectRoot\buildScripts> node myScript.js

Но когда явнутри папки MyProjectRoot выдается:

>> C:\MyProjectRoot> node buildScripts/myScript.js

Произошла ошибка: Ошибка: файлы не соответствуют шаблону: ../functions/index.js


ВОПРОС

Как мне запустить его из корневой папки myProject и все же получить правильный путь?


Я не знаю, зависит ли это от скрипта / пакетов, которые я запускаю, поэтому вот полный исходный код скрипта:

myScript.js

Я использую пакет replace-in-file для обновления импорта. В какой-то момент это будет скрипт postBuild .

const escapeStringRegexp = require('escape-string-regexp');
const fromPath = './src';
const fromPathRegExp = new RegExp(escapeStringRegexp(fromPath),'g');

const replace = require('replace-in-file');
const options = {
  files: '../functions/index.js',  // <----------------------------------
  from: fromPathRegExp,
  to: './distFunctions',
};

replace(options)
  .then(results => {
    console.log('Replacement results:', results);
  })
  .catch(error => {
    console.error('Error occurred:', error);
  })
;

1 Ответ

1 голос
/ 05 ноября 2019

Следующий вопрос (ссылка ниже) очень помог (это , но не дубликат ):

В чем разница между __dirname и ./ в node.js?

А вот и рабочая версия скрипта. Он работает независимо от того, откуда вы его выполняете.

const path = require('path');
const escapeStringRegexp = require('escape-string-regexp');
const fromPath = './src';
const fromPathRegExp = new RegExp(escapeStringRegexp(fromPath),'g');

const replace = require('replace-in-file');
const options = {
  files: '../functions/index.js',
  from: fromPathRegExp,
  to: './distFunctions',
};

console.log('This is the __dirname: ' + __dirname);
console.log('This is the __filename: ' + __filename);
console.log('This is process.cwd(): ' + process.cwd());
console.log('This is the ../functions/index.js: ' + path.resolve('../functions/index.js'));


process.chdir(__dirname);
console.log('CHANGED cwd WITH process.chdir');

console.log('This is the __dirname: ' + __dirname);
console.log('This is the __filename: ' + __filename);
console.log('This is process.cwd(): ' + process.cwd());
console.log('This is the ../functions/index.js: ' + path.resolve('../functions/index.js'));

replace(options)
  .then(results => {
    console.log('Replacement results:', results);
  })
  .catch(error => {
    console.error('Error occurred:', error);
  })
;
...