Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't npm install correctly build dependency from a fork of a package on npm?

I have a project that uses an older version of react-bootstrap

in my package.json I had

"react-boostrap": "^0.13.3"

And there is a bug in there that is causing an issue, the fix for it is very simple so I forked the repo, rolled back to the commit for v0.13.3 doing:

git reset --hard <commit-hash>

made my 1 line fix, then force pushed back to my fork.

Then I updated my package.json in the main project to point to my fork:

"react-boostrap": "mygithubrepo/react-bootstrap"

I deleted the node_modules directory and ran sudo npm cache clear to make sure everything was nice and fresh. Then I ran npm install which did pull down my version of react-bootstrap from the repo.

However, the version it now pulls down isn't in the same format in the node_modules folder. Essentially, it doesn't seem as if it's built the project.

If I use:

"react-boostrap": "^0.13.3"

then the node_modules folder contains the built code like so:

+node_modules
--+react_bootstrap
----+utils
-----Acordion.js
etc.....

But when I point it to my forked version of the repo:

"react-boostrap": "mygithubrepo/react-bootstrap"

Then I get just the source repo structure in node modules (and it doesn't seem to be built)

+node_modules
--+react_bootstrap
----+docs
----+ie8
----+src
-------+utils
--------Acordion.jsx
........etc.....
----+tools
etc.....

Now when I reference react bootstrap using require('react-bootstrap') then it doesn't work (because the files haven't been built).

So what is different between me pointing to the file on npmjs rather than on github? There isn't any prepublish/publish/postpublish script in react-bootstrap package.json so I'm not sure if they manually built it before pushing to npmjs.

Basically, I need to get my forked version automatically built when I run npm install on my main project. Any ideas?

Edit 1

The errors I get running npm install on the main project repo after updating my fork of react-bootstrap as per Jonathan Muller's answer below:

>> Local Npm module "grunt-contrib-uglify" not found. Is it installed?
>> Local Npm module "grunt-amd-wrap" not found. Is it installed?
>> Local Npm module "grunt-react" not found. Is it installed?
>> Local Npm module "grunt-contrib-clean" not found. Is it installed?
>> Local Npm module "grunt-contrib-watch" not found. Is it installed?
>> Local Npm module "grunt-contrib-copy" not found. Is it installed?
>> Local Npm module "grunt-browserify" not found. Is it installed?
>> Local Npm module "grunt-contrib-requirejs" not found. Is it installed?
Warning: Task "clean:amd" not found. Use --force to continue.

Aborted due to warnings.
like image 410
TheStoneFox Avatar asked Oct 31 '22 19:10

TheStoneFox


1 Answers

In your package.json, add the following to build it when you npm install it:

{
  "scripts": {
    "postinstall": "grunt build"
  }
}

This way the package will be built after install

Then to get it working with require, add the following to the package.json:

{
  "main": "amd/react-bootstrap.js"
}

So the correct file can be found when you "require" it. Otherwise it search for index.js

like image 58
Jonathan Muller Avatar answered Nov 15 '22 06:11

Jonathan Muller