Geoffrey Broadwell wrote:

A friend suggested that rather than trying to form a module distribution
network for every individual module, especially using CPAN-style
tarballs-over-HTTP distribution, a much more likely scenario is a
torrent service for full Power Packs (the top few of which are likely to
be sufficiently popular to actually take advantage of traffic sharing).

I'm not saying *we* do this, just that it is a reasonable thing for some
enterprising group to decide to do -- without having to do Google-scale
work.

Yup, that's sensible. They wouldn't even have to create tarballs for the Packs, they could set it up to create a bittorrent download queue of individual modules from the Pack spec JSON file (bittorrent breaks everything down into small chunks anyway, so it might as well start that way).

  * Tools must properly handle the difference between user-local,
    site-local, and vendor-installed modules.
Not sure this really matters.

I seem to recall the Perl 5 toolchain people actively iterating to get
this right, so I'm trusting they've thought about it enough to share
their institutional knowledge here.

What I mean is, we should make it possible to add additional directories to Parrot's library/include/dynext path search (it's already possible), but there's no reason we need to specifically support user-local, site-local, and vendor-installed. They're all just instances of a custom install/search path. (And frankly, I never found those categories particularly useful in Perl anyway, so don't want to make them canonical in Parrot.)

  * Sufficient for automated programs to create system packages
    (DEB, RPM, etc.).
That would be tough, but we can at least cover the simple cases, with guidance to point people toward how to extend the generated template to handle the harder cases.

Sure.  As long as we don't treat perfection as a hard requirement,
thinking about the issues here can help flesh out weak points in the
spec.

Aye, it's a good test case. I would put it as a lower priority than getting the main install process working.

  * Separate static v. configure-discovered v. hand-edited metadata.
    Separate files?
Sounds overly complex. Provide a field in the metadata for "data_source".

This came from a thread I noticed in #toolchain.  I had not had time to
investigate it fully, but I'll ask in more depth for the next iteration.

Makes sense.

  * Specifies rules for dependency string parsing/interpretation.
Not sure what you mean. More detail?

Just as examples, not a complete list, a module in the wild could
reasonably declare dependencies against:

* Other modules from the same or other HLLs, or Parrot itself
* Power Packs
* System libraries, which vary between OSen in basename, version,
  basic architecture ('libfoo' versus 'Foo Framework'), etc., and may or
  may not require foo-dev packages to work with
* System tools, which vary in name and versioning across platforms
  ('make' v. 'nmake')
* Operating system versions ('linux 2.6.30+' or 'Windows Vista+')
* Alternatives ('iceweasel | firefox | safari | web-browser')
* Virtual dependencies (depending on something that multiple packages
  provide, such as 'web-browser' above)

Each of these is potentially in a different namespace, with its own
rules about how version strings are parsed and compared (the rules for
cpan shell are not the same as those used by apt-get, for instance).

The easy thing is to punt off most of the parsing to namespace-specific
parsers; PHP should know how to parse and compare PHP module versions.
But even if we do that, we need a meta-syntax that allows us to specify
which namespace a dependency string should be interpreted in.

As a first try, we could do:

    namespace:'dependency_string'

Thus:

    perl5:'Foo::Bar 2.16'
    perl6:':name<Baz::Biff>:auth<CPAN:QUUX>:ver<3.15.*>'
    apt:'zlib1g (>= 1:1.2.3.3.dfsg)'

But that's a bit ugly ... plus we still have other questions to resolve,
such as how to specify alternates across namespaces.

All of which is just to say: because we need to work with all of the
existing dependency metadata of every other module ecosystem out there,
there's a lot to think about even if we try to punt most of the details.

Ack, that's a total nightmare. Step one is to punt for anything installed by Aviary, and trust the metadata to provide the right version number.

The primary interface should be a web form where people can enter metadata about their module. They should also be able to *update* the information stored there, to mark an older version as deprecated, that a module is no longer maintained, change the owner(s), change the URI for download, or to remove a module entirely. (Look at Launchpad.net for inspiration.)

I can certainly see offering this as *an* interface.  But I don't buy it
as the primary interface.  Manual labor that has to be replicated on the
project's source hosting site (which may be Launchpad.net or github or
what have you) and on Aviary as well breaks the main requirements of
making things dead easy for the module authors and not adding any
additional friction to their (probably volunteer) workload.

See, you're assuming that it's the module authors who will be submitting this information (like CPAN). Aside from a few modules developed by Parrot team members, most modules won't be submitted to Aviary by their authors. They'll be submitted either by Parrot team members getting the system started, or they'll be submitted by users of the Python/Perl/PHP, etc module who want to use it with Parrot.

Or they could register their repository *once*, and we can pull the info
(perhaps polling, perhaps on request).  Or if the posting site can feed
us release notices, we can use that.

We should work very hard to add as little extra work for authors as
possible, and definitely avoid adding an extra manual publish step.
Yes, we can offer the manual process as an option ... just not the only
one.

They're not going to put Aviary information in Launchpad.net or github repositories. If the system requires module authors to do anything at all, it won't work. We can't depend on them. (Just ask the linux distribution packagers. Module authors know nothing about your distribution system and don't want to know.)

I completely agree on not duplicating the information. So we *only* keep it in the Aviary database. Updating it is two quick clicks through the web interface.

I admit I'm prejudiced against making people enter data through a plain text file. It seems horribly primitive and 1995 (META.yml blech!), especially when we know exactly what data we need. But, to look at it from a more practical perspective: presenting it as a web form means that any average Joe who has done an install of the module can walk through the guided web form and tell us how to do it. JSON text input means a) they have to know JSON, b) they have to know our JSON format, c) they have to look up what's required, what's optional, and what the various options are. All of which will mean we'll get far fewer helpers building up Aviary's module data set.

And honestly, I think it's backwards. Aviary should be a standalone "Pack" that has Parrot as its first dependency. (If you have Parrot installed, great, if not, it'll install it for you. It's pretty much what Rakudo does already.)

There's a chicken and egg problem here, and I see no obvious reason that
one logically comes first.  I don't think the user cares either way, as
long as they only have to perform one manual step.  More important I
think is the branding -- do we want to brand ourselves as Parrot or as
Aviary?  Whichever one the user installs manually is the one they will
probably perceive as the primary brand.

I was thinking of it as the "Parrot Aviary", so no branding problem.

My reason for choosing Parrot first was actually more technical -- we
make binaries/system packages of Parrot for various operating systems,
and Parrot once installed provides a nice abstract layer insulating us
from a lot of operating system differences.  Thus building Aviary on top
of Parrot makes use of Parrot's platform.  Building Aviary separately
from Parrot, so that it can be used to install Parrot, just forces us to
solve lots of portability issues all over again.

It's just a bootstrapping problem. I might be more daunted by it, but Rakudo has a pretty good working solution.

It will eventually become irrelevant, when Parrot is installed on more systems by default. But for now, we have to assume the user has nothing Parrot-related installed when they get started.

Bloating the core Parrot distribution with a pile of modules that are only used to install more modules really doesn't make sense when most users are likely to be installing via apt-get, yum, cygwin, etc.

Parrot core should be light, a module installer should be light and optional.

And however we do it, we shouldn't trample the system's Parrot or Aviary
if they were installed using the native package tools.

Yes, we shouldn't trample over a system installed Parrot or Aviary. It's a configuration test "should we install Parrot?"

For now, it doesn't really matter if Aviary has the ability to install Parrot. If you can just get it working as something that's installed as a module on a system Parrot, you'll be doing well.

No, not all of them.  Or at least, Packs should be available in
'regular' as well as 'all-in-one'.  This goes back to my reasons for
Parrot to be installed first.  People making Power Packs should have the
option to create bootstrapping Packs, but it doesn't make a lot of sense
to me that bootstrapping be the default.  I'm quite likely to want to
install the Games, Education, Science, and Graphics Packs all at once.
I see them as add-ons to a central system, not completely independent
things.

Ditto to above, get it working first, then worry about making the install process easier.

  * Default to simple (CPAN-style) dependency resolution; upgrade to
    full resolution and system package awareness in Basic Batteries.
Not sure what you mean. More detail?

The first part was about handling edge cases such as conflicts/provides
graphs that can only be resolved by upgrading multiple modules in
concert to particular versions and removing other modules at the same
time.  The second part was about knowing that particular non-Parrot
system packages were installed (and what versions).

Again, this is your biggest nightmare, the hardest problem to solve. It's also one that's already solved by Debian, *BSD, cygwin, MacPorts, etc, so be wary of reinventing wheels.

Skip the manifest, it's a pile of duplicated data that's only needed by the build process (by the time you start the build process, you have the tarball anyway).

This was conceptually to support script-free module installs and a few
other similar ideas.  This feels like a 'play it by ear' sort of thing;
I'm too tired to be sure whether a detailed manifest is really useful or
not.

Aye, the devil is in the details. The general principle is to keep Aviary as light and simple as possible, get it working, and only add complexity where you absolutely can't avoid it.


I don't see anything here for "standard build instructions". As in, the specific command-line instructions for "configure", "build", "test", and "install". These could allow variable substitutions from parrot_config (or Aviary's collected configuration information), so Rakudo's "perl Configure.pl" could be "@perl@ Configure.pl", while Pynie's "python setup.py build" could be "@python@ setup.py build", and a general 'make test' could be "@make@ test" (to allow for nmake, etc).

The standard instructions should be 'aviary install foo-pack'.
Everything else is either advanced usage or internal details that I
think we'll work out as we come across them.

Oh, you misunderstood, I meant store the install instructions that Aviary will have to use to install the module. CPAN has the luxury that all modules use one single standard set of installation commands, so it can run them automatically. Aviary will be facing a host of different techniques for installation, so the easiest way to let it do an automatic build is to record the commands in Aviary's metadata. That's really all it needs, "where do I get the tarball?" and "what commands do I run on it?".

Allison
_______________________________________________
http://lists.parrot.org/mailman/listinfo/parrot-dev

Reply via email to