[racket-dev] Packages
I stand by my recommendation from December:
http://lists.racket-lang.org/dev/archive/2012-December/011218.html
That is, I think this suggestion should be phrased as a patch.
As implied in my quote below, I tried something much like you're
describing, and I was unhappy with the resulting complications. Maybe I
implemented the idea wrong, and maybe you'll come with something better
--- all the more reason to phrase your suggestion as a patch.
At Mon, 8 Apr 2013 16:18:18 -0400, Eli Barzilay wrote:
> This is a (long) criticism of the current state of the package system.
> (It is a by-product of PR13669, where I raised that point.)
>
> Executive summary: I very strongly think that "pkg create" should
> change. See the bottom for my suggestion.
>
>
> * Most code development happens in a single collection
>
> It all starts at how someone is expected to approach developing a
> "package", regardless of how this is defined in the current system. A
> quick way to get to the core of the problem is to consider what you'd
> expect to do when you start working on some "foo" package. Under
> probably most package systems and most distribution systems, you'd
> begin with a "foo" directory and work there. But with the new package
> system, you get an extra level of directory structure: you need to
> make up a "foo" directory with a "foo" subdirectory (usually).
>
> I know that the way I develop packages (again, not using the formal
> definition of the package system) does *not* do that. I also know
> that many other people don't do that. In fact, I can think of very
> few *existing* examples that would benefit from such a thing. This is
> in contrast to Jay's view, who said that he used multiple-collection
> per package because he wanted it to "match what users have".
>
> So just to make sure that I'm not talking out of my ass, I looked at
> all of the existing packages. Here are some numbers (manual count, so
> it's all estimated):
>
> 42 Single-directory packages, holding at most some meta stuff like a
> README file at the top (IIRC, there was only one case with an
> info.rkt file too). Out of these, about 8 use an existing
> collection name like "data", "file", or "net".
>
> 19 Multi-directory packages.
>
> This makes it look like there's a good case for multi-collection
> packages, but:
>
> 14 of these multi-collection things have a single collection and a
> "tests" one. As discussed in the past several times, the general
> agreement was that it's better to have tests inside the relevant
> collection (and the future trend is likely to shift to have tests
> *in* the source code).
>
> So the real numbers are 56 single-collection packages, and 5 multi
> ones. Of these multi-collection packages, one was exactly the case I
> thought that would benefit from this: Carl's "mischief", which is
> declared as "a bunch of stuff" and arguably would benefit from
> splitting into proper packages should there be sufficient demand. In
> the same category, there is soegaard's even more explicitlty named
> "this-and-that".
>
> This leaves exactly 3 cases where the multi-collection is really used
> -- and two of them are Jay's packages (the other is from dvanhorn).
>
> I take this as reaffirming my guess that pretty much all developement
> happens in a single collection. I'll note that there is, however, a
> point for using existing collection names -- not a strong one, but
> the ~20% (8 of the first 42) number of packages that use an existing
> collection name was roughly the same in the multi-packages too.
>
>
> * The package = multiple-collections feature is bad
>
> Given the above, one way in which the multiple-collections per package
> is bad is obvious: it's yet another complication on the way of a
> random hacker's to contribute code. It means that developers need to
> unnaturally move code into a subdirectory, including existing code in
> repositories. That's a *real* problem in some cases. Two quick
> examples:
>
> * Like many other people, I have my "directory of stuff", with
> random code and random collections. If I make that into a
> package, then any later publishing of some part of it as its own
> package means that I need to shuffle files around. With an
> existing repository, and especially if I want to maintain my
> revision history, this leads to yet more acrobatics than a quick
> move to a subdirectory.
>
> * The handin-server and -client should clearly be developed
> together -- but they should not be distributed together, since the
> only the latter is what students need. The best way that I can
> think of to address this is still bad: make them into a single
> package, and add instructions on packaging just the client to
> students. It's true that such instructions already exist -- but
> there is no reason to complicate these instructions.
>
> Another way to see why multiple collections per package are bad is to
> consider the "raco link" command. This command takes the collection
> *names*, and originally this was the only thing it did. Only after
> Matthew implemented it, he added the `--root' option -- and he did
> that after a request that I did, with the explicit scenario in mind of
> accommodating such a "directory of stuff". The package system, as
> currently implemented, takes this non-default `--root' flag, and
> adopts its behavior as the default.
>
> But the problems are not only at a techincal level, thery're also
> higher up. Making collection roots into the unit of distribution
> means that people need to be aware of them. In fact, this is actually
> making a "collection root" into a new concept -- before the package
> system it was just a place to look for toplevel collections, but now
> it has turned into sometimes a place for collections, and sometimes a
> container of multi-collection packages (as well as such a place).
>
>
> * What can be done
>
> Just to be clear, I completely agree that it would be insane at this
> point to do some kind of an incompatible change. But looking at the
> list of "raco pkg" subcommands, there's one command ("install") that
> deals with a package URL, several commands that deal with the name of
> an installed package, and one command -- "create" -- that deals with
> these "package directories". So if just this commad is revisited, the
> issue can be resolved.
>
> I originally thought that it makes sense to either have a new command
> that packages specified collection directories (or names) instead of
> collection roots. It's a small change: you just name the
> collection(s) instead of naming a root that has the collections as
> subdirectories.
>
> Jay suggested "packagify", which was actualkly a good hint for me to
> do this writeup: I thought about what exactly bothers me about having
> such a weird name -- and the thing is that I think that it's this
> command that should be the more popular one, so a weird name for it
> would not be a good choice. The next obvious thing to consider is a
> better name -- something like "pack" -- and the problem with that is
> that it will be very confusing for users to have both "pack" and
> "create" with these subtle differences.
>
> The next name that I considered was something like "pack-collection",
> or even possibly something like "pack-collection" and rename "create"
> as "pack-collection-root". But this is bad also for exactly the
> reason that Matthew said in the PR, which I think is a very good
> guideline for this suggetion and for the overall design of the package
> system:
>
> | I thought it would be a simpler path for people who already
> | understand collections, but it turned out to be more complex and
> | more confusing to have more ways of doing things.
>
> So the problem of having two "pack-" or "create-" variants is that
> people should still be aware of the two things, and more specifically,
> the concept of a "collection root directory" (or whatever it gets
> called) doesn't go away.
>
> Together with "raco link", I now think that the package system (or
> specifically, the "create" command) should do exactly what it does:
> the default would accept a collection directory and make it into a
> package, and with a "--root" flag, it would package up the whole
> specified collection root.
>
> There are a few technical details to deal with. The few that I see
> are:
>
> * What happens when there is more than one collection specified in a
> single "create" command. Following the above analysis of existing
> packages, I think that it makes sense to have the "main" collection
> be the first, and optionally further "support" collection specified
> later -- which means that the package meta-data is taken from the
> first collection. The reason this follows what I see now is that
> most cases of two directories had a "tests" directory, and it makes
> sense to do something like
>
> raco pkg create path/to/foo path/to/tests/foo
>
> and given that "path/to" is one of my roots, the "create" command
> will package the two collections of "foo" and "tests/foo".
>
> * Another question is what happens when I specify a collection that is
> not a toplevel collection. The way that this can be done is what I
> wrote above: track it to its root, and use that as the path to the
> collection in the package.
>
> * Finally, there's the question of manually packaged directories and
> single-collection repositories. I think that both of these cases
> should be dealt with in a similar way -- when you create a package
> URL, you also specify whether it is a "--root" more or not, with the
> default being off. Existing URLs will be treated as being in
> "--root" mode so they all continue to work fine.
>
> Alternatively, this could be specified in the package's toplevel
> info.rkt file, which "pkg create" would check, but with a default of
> non-"--root" this means changing existing repositories.
>
> This is a relatively minor change, but I think that conceptually it
> greatly simplifies things. One of the main problems I had with planet
> is that it was too heavy for random users. The new system is
> certainly lighter, but I think that such a change will make it
> significantly more usable in that it's much closer to "just dump your
> bunch of files on the web".
>
> --
> ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay:
> http://barzilay.org/ Maze is Life!
> _________________________
> Racket Developers list:
> http://lists.racket-lang.org/dev