【问题标题】:Yeoman giving permission errors even with sudo即使使用 sudo,Yeoman 也会给出权限错误
【发布时间】:2018-05-14 11:32:13
【问题描述】:

我关注 this tutorial 并安装了 Yeoman 和 Azure 的生成器。

所以,当我这样做时:sudo yo azuresfcontainer,它给了我以下错误:

/usr/local/lib/node_modules/yo/node_modules/fast-glob/out/providers/reader-sync.js:45
            throw err;
            ^

Error: EACCES: permission denied, scandir '/usr/lib/ssl/private'
    at Object.fs.readdirSync (fs.js:875:3)
    at exports.readdir (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/sync/fs.js:18:20)
    at Object.safeCall [as safe] (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/call.js:24:8)
    at DirectoryReader.readNextDirectory (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js:78:10)
    at Readable.DirectoryReader.stream._read (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js:57:18)
    at Readable.read (_stream_readable.js:455:10)
    at readdirSync (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/sync/index.js:27:21)
    at Function.readdirSyncStat (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/index.js:34:10)
    at ReaderSync.dynamicApi (/usr/local/lib/node_modules/yo/node_modules/fast-glob/out/providers/reader-sync.js:61:24)
    at ReaderSync.api (/usr/local/lib/node_modules/yo/node_modules/fast-glob/out/providers/reader-sync.js:53:25)
Emitted 'error' event at:
    at DirectoryReader.emit (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js:365:14)
    at call.safe (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/directory-reader.js:81:14)
    at onceWrapper (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/call.js:45:17)
    at onceWrapper (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/call.js:45:17)
    at exports.readdir (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/sync/fs.js:22:5)
    at Object.safeCall [as safe] (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/call.js:24:8)
    [... lines matching original stack trace ...]
    at readdirSync (/usr/local/lib/node_modules/yo/node_modules/@mrmlnc/readdir-enhanced/lib/sync/index.js:27:21)

我哪里做错了?

【问题讨论】:

    标签: azure yeoman azure-service-fabric yo


    【解决方案1】:

    我不认为你做错了什么,它看起来像对 yeoman 的依赖破坏了 yeoman。它是 yeoman-environment 依赖,这个问题已经打开:https://github.com/yeoman/environment/issues/97 复制粘贴下面的问题:

    运行yo时出现如下错误:Error: EACCES: 权限被拒绝,scandir '/usr/sbin/authserver (MacOS / High Sierra)

    罪魁祸首在这里:

      // Adds support for generator resolving when yeoman-generator has been linked
      if (process.argv[1]) {
            paths.push(path.join(path.dirname(process.argv[1]), '../..'));
      }
    

    在 getNpmPaths() 中。我的哟在 /usr/local/bin/yo,这增加了 整个 /usr 目录到搜索路径 => globby.sync 里面 如果某些目录不是用户,resolver.findsGeneratorIn 将抛出 可读。

    这样可以解决问题:

    try {
          modules = modules.concat(globby.sync(
            ['generator-*', '@*/generator-*'],
            {cwd: root, onlyFiles: false, absolute: true}
          ));
    } catch(err) {
         debug( 'Could not access %s (%s)', root, err); 
    }
    

    我可以通过将全局包安装到不同的文件夹来解决这个问题。 https://docs.npmjs.com/getting-started/fixing-npm-permissions

    为了尽量减少权限错误的机会,您可以将 npm 配置为 使用不同的目录。在这个例子中,它将是一个隐藏的 主文件夹中的目录。

    在开始之前备份您的计算机。

    为全局安装创建一个目录:

    mkdir ~/.npm-global 
    

    配置 npm 以使用新的目录路径:

    npm config set prefix '~/.npm-global'
    

    打开或创建一个 ~/.profile 文件并添加以下行:

    export PATH=~/.npm-global/bin:$PATH
    

    回到命令行,更新你的系统变量:

    source ~/.profile
    

    测试:不使用 sudo 全局下载包。

    npm install -g jshint
    

    您可以使用相应的 ENV 变量来代替步骤 2-4(例如,如果您不想修改 ~/.profile):

    NPM_CONFIG_PREFIX=~/.npm-global
    

    【讨论】:

    • yeoman-environment 说“发布了带有此修复程序的新版本。”所以现在应该可以了。