[Rubygems-developers] Post-install scripts etc
Eivind Eklund
eivind at FreeBSD.org
Fri Oct 1 16:44:07 EDT 2004
Problem:
There are things developers want to do to finish setup that
RubyGems do not support, A number of these things vary from
system to system, and they can be implemented correctly and
incorrectly on other levels.
"Perfect" solution:
Provide all the helpers the developers need to do the tasks,
available as "extra specification" for the package (so any form
of common task is implemented once and done right). And this
should be trivial to learn for the developer.
More details:
We need to somehow provide support for these helpers. The
problem is there is a bunch of people around the world that will
develop the applications, and that we have too little experience
to really know what helpers they'll need. And lacking
coordination and tracking of the helpers, we'd get a ton of
broken helpers (not working on various systems etc).
I'm already seeing people forcing gems to work as binary
distributions, leading to cross-platform brokenness, and people
doing post-install scripts that are Unix-specific, so the cross
platform issues already rear their head.
How to move from here to there:
What we IMO want to do is allow post-install-hooks for a while
(to gather what people need done), but refactor all of them to
use generic helpers. Then maybe let the post-install-script
functionality "loose" when we've gotten more experience with it
in this context, or maybe decide that the helpers are
sufficient and that we don't need to let the functionality out.
"But implementing that is not possible - RubyGems is
distributed", I hear you scream.
Here's a design (first the interface, then the implementation):
Interface:
A packager can add post-install-hooks, but these only work with
versions of RubyGems AT OR BELOW the point in time where the Gem
is released.
If the gem is used with a later version of RubyGems, the
post-install-hook is only mentioned as being available (adding a
separate command to run it, and mentioning that it is outdated),
unless it has been registered with RubyGems for changing, in
which case RubyGems run the INTERNAL version of the
post-install-hook (which may be refactored to use the new
helpers) instead of the version in the package.
Implementation:
Each post-install-hook is labelled with a nonce (number used
only once; basically a large random number) identifying the
hook. When a hook is submitted to the RubyGems team, this nonce
is entered as an internal identifier for the hook. Let's call
this the pih-nonce.
Each RubyGems release include a nonce. Call this the rg-nonce.
Each post-install-hook list what rg-nonces it work with. It
cannot list rg-nonces that are not yet published, because the
author does not know about them, so invalidation for future
releases happens automatically.
An optimization (that is harder to implement) is to use
public/private keys and publish a version number signed with a
private key for each release of RubyGems, and have RubyGems
include a public key it use to verify this.
A possibly slight improvement for the multiple-rg-nonce variant
is to have each nonce be a prime number, and just multiply them
together for the new nonces. Then each RubyGems variant can
just check if it divides into that number. (The only real
advantage here is having a single number for the person
releasing a package to include, instead of a list.)
There is a less complicated variant than the above with many of the same
advantages - force submission of post-install-hooks if they are to run
automatically, and either sign them or disallow automatic running until
they're included in the next RubyGems release. However, if you want
decentralized construction of packages with post-install-hooks and
collection + refactoring of said hooks, one of the above schemes are
necessary.
Or one could make the collection entirely voluntary, but I suspect
problems with getting that to work in practice - in my experience, it's
hard to get people to submit stuff unless you're actively talking to
them at the moment.
Eivind.
More information about the Rubygems-developers
mailing list