I often have a similar need.  In debian systems, I'm noticed that sometimes
there are "virtual" packages that several competing packages all "provide"
the concrete representation for.  Maybe a simpler syntax using the idea of
"provides" could be used here.

My concrete example, is my js-git demo.  I'm using Chris Dickinson's bops
library to have a common binary data type interface between node Buffers
and browser Uint8Arrays.  His library is very thorough and even depends on
a utf8 codec since the browser hack for utf8 only works if your script tag
it interpreted with the utf8 charset. (other examples are lodash, zepto,
etc)

For some projects, I just want a subset of what bops provides that I can
implement using much less code.  Right now, my plan is to manually install
my module in node_modules "as" the module I'm providing an implementation
for.  But it would be great if npm or some wrapper could know to do this
automatically if I configured my app to use the replacement.


On Mon, May 13, 2013 at 7:15 PM, Ken <ken.woodr...@gmail.com> wrote:

> I've been mulling this problem space a while and decided to "think out
> loud" here to see whether anyone else is exploring similar avenues.
>  There's obviously some good work being done in dependency injection for
> node apps, but I have some instinctual cringe at any dependency injection
> systems that make an appearance within source code, and this seems to be
> common to all of the current ones vying for mindshare in the node community
> (nject, Injector,  dependable, etc.).
>
> As an alternative I've been considering how to solve (some of) this with
> (hopefully) simple extensions to npm to allow installing one module as an
> alias for another.  Might be clearest to start with an example--consider
> some of the many modules providing bindings of MaxMind's GeoIP data (
> https://npmjs.org/search?q=geoip)
>
>    - geoip <https://npmjs.org/package/geoip> 0.4.10 by 
> kuno<https://npmjs.org/~kuno> GeoIP
>    binding for node
>    - geoip-no-city-leak <https://npmjs.org/package/geoip-no-city-leak> 0.4.9-1
>    by cohara87 <https://npmjs.org/~cohara87> A fork of kuno/geoip where
>    the City.lookupSync leaks have been patched
>    - geoip-static <https://npmjs.org/package/geoip-static> 0.4.6 by 
> toots<https://npmjs.org/~toots> GeoIP
>    binding for node. Static native library included. Also deployable on 
> heroku.
>    - geoip-lite <https://npmjs.org/package/geoip-lite> 1.0.10 by 
> bluesmoon<https://npmjs.org/~bluesmoon> A
>    light weight native JavaScript implementation of GeoIP API from MaxMind
>    - geoip-native <https://npmjs.org/package/geoip-native> 0.0.8 by
>    benlowry <https://npmjs.org/~benlowry> A fast, native JavaScript geoip
>    api. This product includes GeoLite data created by MaxMind, available from
>    http://www.maxmind.com
>    - 
> geoip-lite-with-city-data<https://npmjs.org/package/geoip-lite-with-city-data>
>  1.0.5
>    by stagas <https://npmjs.org/~stagas> A light weight native JavaScript
>    implementation of GeoIP API from MaxMind
>    - ...
>
> All of these are similar in purpose and several of them have identical
> exports (or are supersets of another). They vary significantly in
> implementation however, including C bindings to a dynamically linked
> library that must be installed separately, static links to that library,
> and some pure JavaScript with differing performance characteristics.
>  There's also a nice little bit of of connect middleware 
> (connect-geoip<https://npmjs.org/package/connect-geoip>)
> that originally depended on geoip (which is the dynamically linked C
> version) but now depends on geoip-lite (a pure JavaScript version).  Since
> there are significant tradeoffs involved in the various geoip
> implementations it's likely that this decision might not be appropriate for
> everyone, but it seems silly to create and maintain 6 forks of
> connect-geoip just because there are 6 nearly identical libraries it could
> depend on.  (This is also a very natural place to want to inject a mock
> library for tests since actual IP geolocation isn't very deterministic,
> which is how I got to thinking about this in the first place...).   This
> leads to my "as/for" proposal, which would allow a package.json in a
> dependent project to specify the name that a dependency gets installed as,
> e.g. to use geoip-native instead of geoip-lite in your express/connect
> project you could do the following
>
> {
>   "name": "example-project",
>   "version": "0.0.1",
>   "dependencies" : {
>     "express": "*",
>     "connect-geoip": ">= 0.0.4",
>     "geoip-native": { "version": "*", "as": "geoip-lite", "for":
> "connect-geoip" },
>     ...
>   }
> }
>
> Aliased packages are distinguished by an object value instead of a string.
>  Within the object the version key serves the same purpose as the
> original.  When encountering an as statement npm would install the
> package into a directory with the given name, rather than its default.  If
> a for statement is used then the module is installed into the
> node_modules subfolder of that module rather than the root (in this case
> the code for geoip-native would go into .
> ../node_modules/connect-geoip/node_modules/geoip-lite).
>
> I'm not at all clear how much work this would be in npm, and there are a
> lot of edge cases to worry about, but from the perspective of node itself,
> if the aliased package behaves closely enough to the original then this
> should "just work", since the arguments to require are just paths, and the
> actual names of packages don't seem to matter.  The greatest appeal to me
> of this system is that it lives entirely outside of code, and thus could be
> applied to the thousands of existing modules without needing to rewrite
> them.
>
>
>
>
>
>  --
> --
> 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.
>
>
>

-- 
-- 
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.


Reply via email to