Search code examples
yeomanlodashyeoman-generator

Why are my generator methods not inherited?


I'm trying to make a generator that I can then extend to form similar sub-generators

Here's my base generator:

var generators = require('yeoman-generator');

var VolumeAdderBase = module.exports = generators.Base.extend({

    initializing: function() {
        /* ... */
    },

    prompting: function () {
        /* ... */
    },

    writing: function () {
        /* ... */
    }

});

Here's an example sub-generator:

var VolumeAdderBase = require('../../utils/VolumeAdderBase.js');

// console.log(VolumeAdderBase);

module.exports = VolumeAdderBase.extend({

    fileType: "tomcat script",
    containerName: "tomcat",
    containerVolumeLocation: "/opt/tomcat/client-conf/"
});

When I try to run my sub-generator, it does nothing at all. No errors, no nothing.

When I dump the VolumeAdderBase object, there are plenty of methods on there, but they are all the Base ones. The ones defined in VolumeAdderBase are missing.

Am I missing something here? Or is there a better way to create similar sub-generators?


Solution

  • yeoman-generator is only going to run top level methods (Object.getOwnPropertyNames(prototype)). It doesn't go deeper in the prototype; that's by design. If Yeoman was to dig in the prototype, you couldn't use methods like this.destinationPath() or any other helpers as they'd all be schedule to be run - which would just break.

    We have plans to support mixin in the future. But that's not currently the case.

    As a fix, you can manually assign these methods:

    VolumeAdderBase.prototype.prompting = VolumeAdderBase.prototype.prompting;
    // etc...