【问题标题】:How to get the current path of the running Yeoman generator如何获取正在运行的 Yeoman 生成器的当前路径
【发布时间】:2018-05-30 17:18:28
【问题描述】:

我有自己的 Yeoman 生成器。
我创建了一个子生成器来创建一个新的 view 文件夹。

基本上,用法是:

  • 打开一个新终端
  • cd 进入父文件夹
  • 运行yeoman命令yo my-generator:view
  • 按照说明进行操作

这个视图子生成器提示一个文件夹名称。

例如:

如果我想在默认的 views 目录上创建视图 authentication

cd views
yo my-generator:view

结果应该是:

views //- Already created by the main generator
├── authentication
│   ├── authentication.controller.js
│   ├── authentication.template.html

现在,如果我想为身份验证视图创建一个子视图登录

cd views/authentication
yo my-generator:view

结果应该是:

views //- Already created by the main generator
├── authentication
│   ├── authentication.controller.js
│   ├── authentication.template.html
│   ├── login
│   │   ├── login.controller.js
│   │   ├── login.template.html

相反,当前(错误)结果是:

views //- Already created by the main generator
├── authentication
│   ├── authentication.controller.js
│   ├── authentication.template.html
├── login
│   ├── login.controller.js
│   ├── login.template.html

我在这里的困难是当我运行命令时我不知道如何获取当前路径。

实际上,我只是使用默认前缀路径创建新文件夹 app/views/
这就是 身份验证示例 起作用的原因。

但是,当我当前的路径在 views 文件夹中更深时,它会在 views 文件夹的根目录中添加新文件夹。
如果我可以获得(cmd)的当前路径,我应该能够将此路径添加为前缀,而不是设置默认路径而不是静态路径。
这就是 登录示例 不起作用的原因。

一些代码示例:

  • $that 是当前的生成器对象
  • $that.viewNameCamel是用户设置的文件夹名称

我使用 .txt 文件作为模板,然后创建 controller.js 文件。

const filePrefix = 'app/views/' + $that.viewNameCamel + '/' + $that.viewNameCamel + '.';

const exampleData = {
   controllerAlias: 'vm',
   otherVar: 'example'
};

$that.fs.copyTpl(
   $that.templatePath('controller.txt'), 
   filePrefix + 'controller.js', 
   exampleData
);

试过了:

  • $that.env.cwd
  • process.cwd()
  • __目录名
  • path.js 库

类似:

各位,你们知道如何获取当前文件夹路径吗?
这里有替代解决方案吗?

谢谢!

编辑 1:


这里的问题是项目根目录中的.yo-rc.json
该文件重写了路径,因此我应该将其删除以解决问题。
但是,如果我删除此文件,将不再保存用户配置。
我需要它供以后的子生成器使用。

还有其他方法可以保存用户配置吗?
或者再一次,有没有其他方法可以得到当前的真实路径?

【问题讨论】:

    标签: node.js path generator yeoman yeoman-generator


    【解决方案1】:

    我知道这有点老了,但对于以后来的人来说, 来自文档https://yeoman.io/authoring/file-system.html

    If you want to know from where the user is running yo, then you can get the path with this.contextRoot. This is the raw path where yo was invoked from; before we determine the project root with .yo-rc.json.

    根据我的经验,删除 .yo-rc.json 意味着您需要手动检查提供的路径是否正常,固定根点会很有帮助。

    【讨论】:

    • 谢谢!我在文档中错过了这个。这是正确答案:)
    【解决方案2】:

    只需从根目录中删除 .yo-rc.json 文件即可。无论您在文件系统中的什么位置,该文​​件都负责定位您的根目录。

    我不确定移除它会产生什么影响,但我构建的生成器似乎没有发生任何事情。

    现在你可以使用process.cwd(),它会得到正确的工作目录。

    如果您的用例有前缀 app/views,您可能需要编写一些 Javascript 来根据您所在的位置附加或不附加前缀,这应该是微不足道的。

    【讨论】:

    • 感谢您的回答,但我需要保持此文件处于活动状态。其中的数据来自另一个生成器,我需要它们用于视图生成器(如应用程序名称、当前语言、作者……)。我应该能够随时访问这些数据(最终,我可以将这些数据保存在一个新的自定义文件中,我会尝试一些东西)。
    • 嗯,如果您愿意在每个目录中创建一个带有空配置的.yo-rc.json,那么您可以实现这一点,但这将是一个丑陋的目录结构。或者可能有一种方法来创建文件,识别工作目录然后删除文件?太牵强了,但我想值得一试。
    • 如果我可以简单地删除.yo-rc.json文件以获取真实路径,我会找到正确路径的解决方案,不用担心。然后,我必须将所有引用更改为x.config.set(...)x.config.get(...) 以避免创建和使用该文件。另一种方法是使用npmjs.com/package/edit-json-file,这也差不多。然后我将拥有自己的文件,并且内容几乎相同。即使这个解决方案对我来说听起来可行,但仅仅解决路径查找似乎有点过头了。
    • 测试 1: 你是对的,删除 .yo-rc.json 只是修复错误的路径(使用 $that.env.cwd 和 process.cwd())。跨度>
    • Test 2 : 从 filePrefix 中删除 'app/views/' + 加上 Test 1 的东西使子生成器 view 工作喜欢魅力。最后一步是我自己替换整个原生配置。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多