Whist adding a couple of new tasks to my VSTS Manifest Versioning Extension I hit the problem that VSIX package became too big to upload to the Marketplace.
The error I saw in my CI/CD VSTS pipeline was
##vso[task.logissue type=error;]error: Failed Request: Bad Request(400) - The extension package size '23255292 bytes' exceeds the maximum package size '20971520 bytes'
This extension now contains eleven tasks, four of which are now NodeJS based as opposed to PowerShell. The issue here is whereas PowerShell tasks are usually a file or two of code and maybe a PSM module; NodeJS based ones, as well as my logic, always have a Node_Modules folder full of NPM modules needed for production use. This fact had caused a good deal of bloat in the VSIX package.
The solution was to address my poor management of NPM modules. As many of the versioning tasks are similar in logical structure i.e.
- They get a list of files
- Extract a version number from the build number
- Then apply this to one or more files in a product/task specific manner
there has been some cut and paste coding. This means that I have NPM modules in the tasks package.json file that were not needed for a given task. I could manually address this but there is an NPM module to help, DepCheck.
First install the DepCheck module
npm install depcheck –g
then run depcheck from the command line whist within your task’s folder. This returns a list of modules listed in the package.json that are not referenced in the code files. These can then be removed from the package.json. e.g. I saw
Unused dependencies * @types/node * @types/q * Buffer * fs * request * tsd Unused devDependencies * @types/chai * @types/mocha * @types/node * mocha-junit-reporter * ts-loader * ts-node * typings
The important ones to focus on are the first block (non-development references), as these are the ones that are packaged with the production code in the VSIX; I was already pruning the node_module folder of development dependencies prior to creating the VSIX to remove devDependancies using the command
npm prune –production
I did find some of the listed modules strange, as I knew they really were needed and a quick test of removing them did show the code failed if they were missing. These are what depchecks documentation calls false alerts.
I found I could remove the @type/xxx and tsd references, which were the big ones, that are only needed in development when working in TypeScript. Once these were removed for all four of my NodeJS based tasks my VSIX dropped in size from 22Mb to 7Mb. So problem solved.