botframework-components icon indicating copy to clipboard operation
botframework-components copied to clipboard

Optimize package dependencies for generators

Open peterinnesmsft opened this issue 4 years ago • 1 comments

@microsoft/[email protected] has a very large dependency tree. This causes installation of the templates in Composer to take ~30 seconds or more, which impacts the overall latency of the bot creation process.

We should evaluate our package dependencies across the full set of generators and determine if we can decrease the overall size of the dependency tree in order to speed up package installation.

A snapshot of the full dependency tree for @microsoft/[email protected] (obtained using npm-remote-ls) is included below for reference:

└─ @microsoft/[email protected]
   ├─ [email protected]
   ├─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  └─ [email protected]
   │     ├─ @nodelib/[email protected]
   │     ├─ [email protected]
   │     ├─ @nodelib/[email protected]
   │     │  ├─ @nodelib/[email protected]
   │     │  │  ├─ [email protected]
   │     │  │  │  └─ [email protected]
   │     │  │  └─ @nodelib/[email protected]
   │     │  └─ [email protected]
   │     │     └─ [email protected]
   │     ├─ [email protected]
   │     ├─ [email protected]
   │     └─ [email protected]
   │        ├─ [email protected]
   │        └─ [email protected]
   │           └─ [email protected]
   │              └─ [email protected]
   │                 └─ [email protected]
   ├─ [email protected]
   ├─ [email protected]
   ├─ [email protected]
   │  ├─ [email protected]
   │  └─ [email protected]
   ├─ [email protected]
   ├─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     │  └─ [email protected]
   │  │     │     └─ [email protected]
   │  │     └─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     └─ [email protected]
   │  │        ├─ [email protected]
   │  │        │  └─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        │  └─ [email protected]
   │  │        ├─ [email protected]
   │  │        ├─ [email protected]
   │  │        └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  │  └─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  │  └─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  │     ├─ [email protected]
   │  │  │     ├─ [email protected]
   │  │  │     └─ [email protected]
   │  │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     │  ├─ [email protected]
   │  │     │  │  └─ [email protected]
   │  │     │  │     └─ [email protected]
   │  │     │  ├─ [email protected]
   │  │     │  ├─ [email protected]
   │  │     │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     │  ├─ [email protected]
   │  │     │  ├─ [email protected]
   │  │     │  ├─ [email protected]
   │  │     │  └─ [email protected]
   │  │     │     ├─ [email protected]
   │  │     │     │  ├─ [email protected]
   │  │     │     │  └─ [email protected]
   │  │     │     └─ [email protected]
   │  │     │        ├─ [email protected]
   │  │     │        └─ [email protected]
   │  │     └─ [email protected]
   │  │        └─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  │     ├─ [email protected]
   │  │  │     │  └─ [email protected]
   │  │  │     │     └─ [email protected]
   │  │  │     └─ [email protected]
   │  │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  │  ├─ [email protected]
   │  │  │  └─ [email protected]
   │  │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  └─ [email protected]
   │  ├─ [email protected]
   │  │  ├─ [email protected]
   │  │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     ├─ [email protected]
   │  │     ├─ [email protected]
   │  │     ├─ [email protected]
   │  │     ├─ [email protected]
   │  │     │  └─ [email protected]
   │  │     ├─ [email protected]
   │  │     └─ [email protected]
   │  └─ [email protected]
   │     ├─ [email protected]
   │     ├─ [email protected]
   │     ├─ [email protected]
   │     ├─ [email protected]
   │     ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  └─ [email protected]
   │     │  └─ [email protected]
   │     ├─ [email protected]
   │     │  └─ [email protected]
   │     ├─ [email protected]
   │     │  └─ [email protected]
   │     ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  │  └─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  │  ├─ [email protected]
   │     │  │  │  │  └─ [email protected]
   │     │  │  │  └─ [email protected]
   │     │  │  │     └─ [email protected]
   │     │  │  └─ [email protected]
   │     │  ├─ [email protected]
   │     │  └─ [email protected]
   │     │     ├─ [email protected]
   │     │     └─ [email protected]
   │     │        ├─ [email protected]
   │     │        ├─ [email protected]
   │     │        │  └─ [email protected]
   │     │        └─ [email protected]
   │     ├─ [email protected]
   │     ├─ [email protected]
   │     │  └─ [email protected]
   │     ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  │  └─ [email protected]
   │     │  │     ├─ [email protected]
   │     │  │     └─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  │  ├─ [email protected]
   │     │  │  │  │  ├─ [email protected]
   │     │  │  │  │  ├─ [email protected]
   │     │  │  │  │  ├─ [email protected]
   │     │  │  │  │  └─ [email protected]
   │     │  │  │  └─ [email protected]
   │     │  │  └─ [email protected]
   │     │  │     └─ [email protected]
   │     │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  └─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  ├─ [email protected]
   │     │  │  │  └─ [email protected]
   │     │  │  └─ [email protected]
   │     │  └─ [email protected]
   │     └─ [email protected]
   ├─ [email protected]
   │  └─ [email protected]
   │     └─ [email protected]
   ├─ [email protected]
   └─ [email protected]
      ├─ @eslint/[email protected]
      │  ├─ [email protected]
      │  │  └─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  └─ [email protected]
      ├─ @babel/[email protected]
      │  └─ @babel/[email protected]
      │     ├─ [email protected]
      │     ├─ @babel/[email protected]
      │     └─ [email protected]
      │        ├─ [email protected]
      │        │  └─ [email protected]
      │        │     └─ [email protected]
      │        ├─ [email protected]
      │        └─ [email protected]
      │           └─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  │  └─ [email protected]
      │  │     └─ [email protected]
      │  └─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  │  └─ [email protected]
      │  └─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  └─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      │     ├─ [email protected]
      │     └─ [email protected]
      │        └─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  └─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  │  └─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  └─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  │  └─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      │     ├─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      │     └─ [email protected]
      ├─ [email protected]
      │  └─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      ├─ [email protected]
      └─ [email protected]
         ├─ [email protected]
         ├─ [email protected]
         ├─ [email protected]
         ├─ [email protected]
         │  ├─ [email protected]
         │  ├─ [email protected]
         │  └─ [email protected]
         ├─ [email protected]
         │  ├─ [email protected]
         │  ├─ [email protected]
         │  └─ [email protected]
         ├─ [email protected]
         └─ [email protected]
            ├─ [email protected]
            ├─ [email protected]
            ├─ [email protected]
            └─ [email protected]

peterinnesmsft avatar Apr 28 '21 19:04 peterinnesmsft

Some quick evaluation of the direct dependencies within the top-level package:

  • The following are all marked as devDependencies, and as such we should ensure that Composer is not trying to install these:
    • eslint
    • eslint-config-prettier
    • eslint-plugin-prettier
    • prettier
  • xml2js was only required while we were generating a NuGet.config to support sourcing RC packages from MyGet. This dependency should be removed.
  • globby is being used to match template file paths, as utilized in _selectTemplateFilePaths(), and by extension _copyBotTemplateFiles() in baseGenerator.js. The functionality here is so we can pattern match and replace instances of botName in these file paths with the name supplied to the generator. There may be a more effective way to do this without as many dependencies.
  • yeoman-generator is listed as a dependency with version range ^1.1.1. The latest packages are in the 5.x.x range at the time of writing. We ought to upgrade to the latest and ensure we are on a consistent package version across our generators - for example, @microsoft/generator-bot-core-assistant also features a dependency on yeoman-generator, but with a version range of ^2.0.5.

Also of note, our child generators feature a couple of traits that ought to be evaluated:

  • In addition to featuring a dependency on @microsoft/generator-bot-adaptive, they also feature a dependency on yeoman-generator. Not only is there the potential version mismatch issue as outlined above, but we should evaluate if we can simply leverage the version that is pulled in through the base generator dependency.
  • The child generators also feature a dependency on yeoman-test. I would think that this ought to be a devDependency and not a regular dependency, as this ought not to be required in order to run the main generators themselves.

peterinnesmsft avatar Apr 28 '21 20:04 peterinnesmsft