gpt4 book ai didi

javascript - Yeoman 生成器添加新文件生成现有项目

转载 作者:行者123 更新时间:2023-12-01 15:03:52 26 4
gpt4 key购买 nike

我有 yeoman 生成器,它成功生成了一个简单的 sproject。

我希望在 项目生成之后的 之后,使用将能够在 deployment.yaml 文件夹下生成一个新文件 app,但是它需要从主生成器中读取一些数据
例如 appName 作为子生成器需要生成一个新文件
在生成的应用程序中。

例如yo tdk
此命令生成一个新项目

当我运行 yo tdk:event (或类似的东西)时,它将在项目 app 文件夹中生成一个新文件

为了说明,我创建了这个非常简单的生成器

const Generator = require("yeoman-generator");

module.exports = class extends Generator {
prompting() {
this.props = {
appName: "my-app",
srvName: "my-service"
};

const prompts = [
{
name: "appName",
message: "Project name: ",
type: "input",
default: this.props.appName
},
{
name: "srvName",
message: "Service name: ",
type: "input",
default: this.props.srvName
}
];

return this.prompt(prompts).then(props => {
this.props = props;
});
}

writing() {
this.fs.copyTpl(
this.templatePath("app"),
this.destinationPath(this.props.appName),
this.props
);
}
};

这个生成器有两个简单的问题
  • 应用名称
  • 服务名称

  • 它会生成一个类似的项目
    myapp   /root
    -app /folder
    - service.yaml /single file at the project generation

    生成的 service.yaml 如下所示:
    apiVersion: v1
    kind: Service
    metadata:
    name: <%= appName %>
    spec:
    selector:
    app: <%= srvName %>
    ports:
    - protocol: TCP
    port: 80

    现在使用这个 service.yaml 文件生成项目之后
    我想在 后期 (项目生成后)在 app 文件夹下添加新文件 deployment.yamldeployment.yaml
    apiVersion: v1
    kind: Deployment
    metadata:
    name: <%= appName %> //this is the appname from the project generation

    spec:
    replicas: <%= replica %>
    selector:
    app: <%= srvName %>
    appNamesrvName 来自 主生成器
    (我看到有在子生成器之间共享数据的选项
    https://yeoman.io/authoring/storage.html,不确定如何在生成器之间共享)
    并且 replica 应该来自新/子生成器

    这是生成后的项目结构
    myapp   /root
    -app /folder
    - service.yaml /single file at the project generation
    - deployment.yaml / new file added to the project under app folder

    就像用户开始另一个 generator/sub 并有一个新问题,例如how much replicas do you want? 然后生成文件。

    我该怎么做 ?

    更新
    这是我的项目结构
    myapp
    - node_modules
    - package.json //here I declare the main-generator command -> tdk
    - generators
    -- app
    ---index.ts
    --deployment
    ---index.ts
    ---package.json //here I declare the sub-generator command -> deploy
    - node_modules
    - package.json
    -.yo-rc.json //here I see the data that I keep via config.set api

    更新

    当我通过程序调用子生成器时

    const yeoman = require('yeoman-environment');
    常量 env = yeoman.createEnv();
    env.lookup(function () {
    env.run("tdk:deploy", {
    replicas: 100
    }, (err) => {
    console.log("done", err);
    });
    });

    我收到错误:

    out from config undefined : undefined//未定义来自子生成器中的控制台
    done TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received type undefined
    at validateString (internal/validators.js:125:11)
    at Object.join (path.js:1037:7)

    我在子生成器代码中放了一个console.log,例如
      initializing() {
    this.srvName = this.config.get("srvName");
    this.appName = this.config.get("appName");
    console.log("out from config", this.srvName, ":", this.appName);
    }

    当我运行子生成器时,我得到了空配置(来自 .yo-rc.json )
    在检查 .yo-rc.json 时。我能够从主生成器中看到条目,数据已存储,但是当我从程序运行它时,它没有找到它......任何想法?

    这是两个项目的链接(演示这一点的非常基本的 yeoman 生成器)只需要为两个项目运行 npm install对于生成器也运行 npm link

    最后 : 应该生成一个项目 两个文件
    1. service.yaml   // generated from the main generator
    2. deployment.yaml - // generated from sub generator with the properties from the main & sub generator

    目前,没有生成 deployment.yaml 文件

    https://drive.google.com/drive/folders/1kBnZxpVcRR9qhGZagVtod7W4wFmt73C6
    1 . generator-tdk -  Generator and sub-generator 
    2. yeomanEnv - The code which is running the sub-generator to create the file inside the generated project

    我究竟做错了什么 ? :(

    如果子生成器有办法读取 .yo-rc.json ,它可以提供帮助

    最佳答案

    您可以在 configuring 中设置要配置的值像这样的主生成器:

    configuring() {
    this.config.set('appName', this.props.appName);
    this.config.set('srvName', this.props.srvName);
    }

    并读取子生成器中的值:
    initializing() {
    this.srvName = this.config.get("srvName");
    this.appName = this.config.get("appName");
    }

    因此,您可以通过 this.srvName 访问这些值。和 this.appName写作时。

    示例代码:

    应用程序/index.js:
    const Generator = require("yeoman-generator");

    module.exports = class extends Generator {
    prompting() {
    this.props = {
    appName: "my-app",
    srvName: "my-service",
    };

    const prompts = [
    {
    name: "appName",
    message: "Project name: ",
    type: "input",
    default: this.props.appName,
    },
    {
    name: "srvName",
    message: "Service name: ",
    type: "input",
    default: this.props.srvName,
    },
    ];

    return this.prompt(prompts).then((props) => {
    this.props = props;
    });
    }

    configuring() {
    this.config.set('appName', this.props.appName);
    this.config.set('srvName', this.props.srvName);
    }

    writing() {
    this.fs.copyTpl(
    this.templatePath("app"),
    this.destinationPath(this.props.appName),
    this.props
    );
    }
    };

    部署/index.js:
    const Generator = require("yeoman-generator");

    module.exports = class extends Generator {
    initializing() {
    this.srvName = this.config.get("srvName");
    this.appName = this.config.get("appName");
    }

    prompting() {
    this.props = {
    replicas: 0,
    };

    const prompts = [
    {
    name: "replica",
    message: "how much replicas do you want?",
    type: "input",
    default: this.props.replicas,
    },
    ];

    return this.prompt(prompts).then((props) => {
    this.props = props;
    });
    }

    writing() {
    this.fs.copyTpl(
    this.templatePath("deploy"),
    this.destinationPath(this.appName),
    {
    srvName: this.srvName,
    appName: this.appName,
    ...this.props,
    }
    );
    }
    };


    和命令:
    yo <name用于主要项目生成
    yo <name>:deploy索取副本并创建 deployment.yaml
    在不使用 yo 的情况下执行子生成器:
    var yeoman = require("yeoman-environment");
    var env = yeoman.createEnv();

    env.lookup(function () {
    env.run("<name>:deploy", {
    replicas: 100
    }, (err) => {
    console.log("done", err);
    });
    });

    和一个示例子生成器,如果值通过选项( deploy/index.js )传递,则跳过问题:
    const Generator = require("yeoman-generator");

    module.exports = class extends Generator {
    initializing() {
    this.srvName = this.config.get("srvName");
    this.appName = this.config.get("appName");
    }

    prompting() {
    this.props = {
    replicas: 0,
    };

    const prompts = [
    {
    name: "replicas",
    message: "which app to generate?",
    type: "input",
    default: this.props.replicas,
    when: !this.options.replicas, // disable the question if it's found in options
    },
    ];

    return this.prompt(prompts).then((props) => {
    this.props = props;

    // set values from options (if found)
    this.props.replicas = this.options.replicas || this.props.replicas;
    });
    }


    writing() {
    this.fs.copyTpl(
    this.templatePath("deploy"),
    this.destinationPath(this.appName),
    {
    srvName: this.srvName,
    appName: this.appName,
    ...this.props,
    }
    );
    }
    };

    关于javascript - Yeoman 生成器添加新文件生成现有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62347988/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com