Isaac, We have this issue too. We thought symlinks in node_modules would work, but we've got some windows folks, so no luck there. I was looking at npm, and as far as i can tell, it looks like your pattern is to check most of node_modules into git, and then pull in almost all modules, yours and third-parties, using
"repository": { "type": "git", "url": "git://github.com/TooTallNate/node-gyp.git" }, in hand-edited package.json files. Is that right? We are not used to checking in node_modules, but I'm willing to try out your pattern. However, I'm confused about the relationship between the package.json files checked into node_modules, vs the package.json files at the root of the modules in their home repros, for example: https://github.com/isaacs/npm/blob/master/node_modules/node-gyp/package.json vs https://github.com/TooTallNate/node-gyp/blob/master/package.json How are the dependencies kept in sync between the two if Nate changes his? Sorry if this is obvious... Thanks, -George On Saturday, February 9, 2013 6:17:09 PM UTC-8, Isaac Schlueter wrote: > > > The best NPM packages are small and focused > > 100% agree. > > > having lots of internal dependencies is probably a smell. > > Less agree. > > Having lots of internal dependencies is normal for things that are > doing complicated things. However, it's ideal for them to take a > relatively small number of things, and turn it into one thing. Then > you'll tend to end up with lots of meta-deps, but still a small number > of 1st-order deps. > > Module dependency trees ought to be bushy - ie, not a narrow deep > tree, and not a flat long tree. Then, you cna use `npm dedupe` to > remove duplicates, and simplify things before checking into git and/or > deploying. > > > > There is really no functional difference between using this vs relative > requires, it's psychological. It makes me focus on keeping lib pure, and > the lack of ../ gives me the warm fuzzies. > > This is so very telling! Thank you for this fascinating bit of > insight. You captured it so perfectly. > > I'd argue that your "warm fuzzies" reaction is 100% valid: a lot of > ../ in your require paths tends to indicate some inappropriate > intimacy and merging of concerns. However, you haven't actually > solved the problem! You've only removed the surface manifestation, to > make it *look* like you're using nicely abstracted components. But > those components are not, in fact, nicely abstracted. They're still > doing a ../ require into a bag-o-stuff lib folder, but just without > the ".." in the string. > > Why not just put your "emerging utility stuff" in > node_modules/some-util/ and node_modules/some-other-util/, and do > require('some-util') in your app code? List each util as a > "bundledDependency", and check it into git. If you ever decide to > split it out, it's super trivial to do so. > > This way, you'll notice right away if you have too much cross-talk > between them. Because, if "util-a" is pulling in "util-b", but > doesn't list "util-b" as a dependency, then that's an easily spotted > error. If it DOES list util-b as a dependency, you'll force yourself > to think, "Wait a second... why does it *actually* have to depend on > that other thing?", and then wonder if they should be merged (ie, if > they are tightly bound, and probably not a good abstraction > independently), or more fully separated. The smells will be right in > your face, instead of hidden behind a magic folder. > > Over the last year, I've been retroactively doing this with npm, or at > least, trying to find time to do so, and since things are already > working, it's hard to justify the time expenditures. I really wish > I'd built it this way from the start and a lot of annoying mistakes > could have been avoided. Of course, to be fair, at the start, there > was no npm to make this sort of thing easier to do :), but my point is > that it's sooo much easier to do up front rather than trying to do it > later on, once you have a tangled mess. > > > On Sat, Feb 9, 2013 at 12:02 PM, Jacob Groundwater > <ja...@nodefly.com<javascript:>> > wrote: > > There is definitely a method to my madness. > > > > First, I would only recommend doing this in a deployable application, > not a > > module that deploys to NPM. The best NPM packages are small and focused; > > having lots of internal dependencies is probably a smell. > > > > Second, I do this to help filter out code that belongs in a library > anyways. > > I have two directories at the root of my project which separate code > > functionality. > > > > /app <-- contains MVC architecture of web application > > /lib <-- contains emerging utility libraries > > > > > > Note that nothing in /lib should directly require anything in /app. The > > libraries in lib should evolve into separate, and self-contained > modules. > > These are the future candidates for NPM modules. > > > > Since modules in lib should behave like external libraries, I require > them > > like external libraries. I symlink lib into node_modules. > > > > /node_module > > /lib --> ../lib > > > > > > In your application, you can require any of these modules with > > > > var module = require('lib/module'); > > > > > > When time comes to actually refactor these modules into their own code, > it > > is a relatively straight forward to change your application. > > > > Under this model, I was able to hunt down all my upward requires and > help > > eliminate some bad design in the process. > > > > There is really no functional difference between using this vs relative > > requires, it's psychological. It makes me focus on keeping lib pure, and > the > > lack of ../ gives me the warm fuzzies. > > > > Finally, if your only reason is to avoid typing two periods, I would > > question your whole approach. Fewer keystrokes do not make a better > > application. > > > > -- > > -- > > Job Board: http://jobs.nodejs.org/ > > Posting guidelines: > > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines > > You received this message because you are subscribed to the Google > > Groups "nodejs" group. > > To post to this group, send email to nod...@googlegroups.com<javascript:> > > To unsubscribe from this group, send email to > > nodejs+un...@googlegroups.com <javascript:> > > For more options, visit this group at > > http://groups.google.com/group/nodejs?hl=en?hl=en > > > > --- > > You received this message because you are subscribed to the Google > Groups > > "nodejs" group. > > To unsubscribe from this group and stop receiving emails from it, send > an > > email to nodejs+un...@googlegroups.com <javascript:>. > > For more options, visit https://groups.google.com/groups/opt_out. > > > > > -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines You received this message because you are subscribed to the Google Groups "nodejs" group. To post to this group, send email to nodejs@googlegroups.com To unsubscribe from this group, send email to nodejs+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/nodejs?hl=en?hl=en --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.