2017-01-21 16 views
3

Я написал модуль CLI, wikidata-cli, который для определенной команды (wd props) кэширует результаты как файлы в каталоге модуля: node_modules/wikidata-cli/props/some-file. Он работает в моей локальной установке, где узлы и npm были установлены в моей домашней папке (с использованием nvm), но другие люди, установившие узел/npm из своего диспетчера пакетов, возможно, с правами sudo, столкнулись с issues: после установки модуль теряет разрешение чтобы изменить каталог модуля, и они получают ошибки вида EACCES: permission denied, open '/usr/lib/node_modules/wikidata-cli/props/de.json'где модуль должен записывать файлы?

Я попытался изменить разрешение доступа во время сценария постустановочных - "postinstall": "mkdir -p props && chown -R 666 props" - но пришлось revert он блокирует любую установку с ошибкой operation forbidden.

Любой ключ к этому виду файлов должен быть написан кросс-платформенным способом?

ответ

1

Если вы ищете код для записи файлов независимо от того, какой пользователь его запускает, тогда есть только один ответ: гарантируется возможность записи только той папки, в которой текущий пользователь а) и b) не будет сталкиваться с конфликтами между разными пользователями, обращающимися к одним и тем же путям, является собственным домашним каталогом пользователя.

Вы могли бы использовать что-то вроде этого, чтобы получить путь, что текущий пользователь может получить доступ к определенно:

var homePath = process.env.HOME || process.env.USERPROFILE; // POSIX || Win32 

var moduleDataPath = path.join(homePath, ".wikidata-cli"); 

if (!fs.existsSync(moduleDataPath)) 
    fs.mkdirSync(moduleDataPath); 
+1

спасибо! Я закончил писать в '.cache/wikidata-cli' [commit] (https://github.com/maxlath/wikidata-cli/commit/72fefbef77f838fee590cbb81a04cf7957bc0214). Я использовал 'fs.access' вместо' fs.exists', поскольку [этот последний устарел] (https://nodejs.org/api/fs.html#fs_fs_exists_path_callback) – maxlath