<div dir="ltr">Just my $0.01: it seems to me that the direction we&#39;re headed with the pkg system would make a great platform for exploring all kinds of practical security issues surrounding code and distribution (building a very nice research program, I mean). We already have good sandboxing facilities and this lets us explore how to best set those up and how to build web-of-trust type stuff on top of that.<div>
<br></div><div>Robby</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jul 4, 2013 at 1:02 PM, Sam Tobin-Hochstadt <span dir="ltr">&lt;<a href="mailto:samth@ccs.neu.edu" target="_blank">samth@ccs.neu.edu</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Neil,<br>
<br>
You clearly put a bunch of thought into this email, so I think it<br>
needs a response. I&#39;ve changed the subject to put this in a new<br>
thread.<br>
<br>
On Fri, Jun 14, 2013 at 10:48 PM, Neil Van Dyke &lt;<a href="mailto:neil@neilvandyke.org">neil@neilvandyke.org</a>&gt; wrote:<br>
<br>
&gt; For all of my packages, as well as any package I can imagine, I think that<br>
&gt; the original PLaneT got many things right or close to right:<br>
<br>
Some of these features the new package system has:<br>
<br>
&gt; * Files from a package-version end up grouped together in the directory<br>
&gt; structure, specific to that package-version, and certainly not mixed into<br>
&gt; directories with files from package-versions of different package-names.<br>
<br>
While collections now &quot;splice&quot;, this is still true.  When I install a<br>
package, it creates a new directory and everything goes there. For<br>
example, &#39;raco pkg install -i gcstats&#39; produces the directory<br>
`/home/samth/sw/plt/racket/lib/pkgs/gcstats`.<br>
<br>
&gt; * Flat namespace (let&#39;s ignore the PLaneT package-owner part for now),<br>
&gt; without attempt to name packages according to some topical ontology.<br>
<br>
This is still true.<br>
<br>
&gt; * Metadata in &quot;info.rkt&quot;.<br>
<br>
Also still true.<br>
<br>
&gt; * Some kind of unique package-name controlled by a developer.<br>
<br>
This is true to the same degree it was with Planet. That is, if you<br>
want to register your package at `<a href="http://pkg.racket-lang.org" target="_blank">pkg.racket-lang.org</a>`, then you have<br>
to have a unique name. Otherwise, you can locally install whatever you<br>
want and give it a name that conflicts, or run your own server with<br>
similar consequences.<br>
<br>
Some things are different:<br>
<br>
&gt; * Multiple versions for a given package-name (I&#39;ll call them<br>
&gt; package-versions in this email) can be installed, and there is some version<br>
&gt; selection mechanism.<br>
<br>
This is no longer true, and this is where the new system differs from<br>
other systems such as &#39;npm&#39; as well. I think this was, in fact, a<br>
major _problem_ with Planet, and one that I&#39;m personally glad the new<br>
system doesn&#39;t have.  I think there are a few problems with what<br>
Planet did:<br>
<br>
1. Many packages can&#39;t really work with multiple versions in the same<br>
program, whether because of generative structs, or files used, or many<br>
other issues.<br>
<br>
2. The way Planet versions were selected was mostly hardwired, and<br>
everything was hard to upgrade.<br>
<br>
There were other problems, too, but these are the ones I remember<br>
being most significant.<br>
<br>
However, I _think_ (the documentation is pretty terse) that the<br>
`--scope-dir` option to `raco pkg install` can help you simulate a<br>
more npm-like workflow.<br>
<br>
&gt; I was expecting to use this original PLaneT as a starting point, and evolve<br>
&gt; it in ways like the following...<br>
&gt;<br>
&gt; * In addition to the &quot;(planet ...)&quot; require-specs, package-versions also can<br>
&gt; come from &quot;http:&quot;, &quot;https:&quot;, and &quot;git:&quot; URLs.  (&quot;github:&quot; would also be OK.)<br>
&gt; Each such URL would identify trees or a tarball.  Then we see how people<br>
&gt; choose the PLaneT server vs. HTTP vs. Git over time.<br>
<br>
Package dependencies can be specified with URLs, which can specify<br>
remote directories, or remote ZIP (or tar etc) files, or local files<br>
or directories, or GitHub repositories.  I hope to add support for<br>
arbitrary git remotes soon (if the `git` binary is available).<br>
<br>
&gt; * Maybe improve the version-selection and compatibility support.<br>
&gt; Investigate whether it&#39;s worthwhile to separate out the<br>
&gt; backward-compatibility information from the static package-version<br>
&gt; distribution (and especially from the version number), or whether in<br>
&gt; practice there are simpler ways that are satisfactory.<br>
<br>
I think decoupling the source code from the version specification is<br>
exactly the improvement wanted here.<br>
<br>
&gt; * Maybe a facility in &quot;info.rkt&quot; to provide aliases for require specs.<br>
&gt; Otherwise, people writing nontrivial multi-file code that uses other<br>
&gt; packages from PLaneT/whatever end up having to make wrapper modules so that<br>
&gt; we don&#39;t goof our require-specs and accidentally depend on multiple<br>
&gt; package-versions for the same package-name.  Note that, with URLs, these<br>
&gt; aliases *might* be the only actual package-name construct in the HTTP/Git<br>
&gt; system as distinct from URL similarities of package-versions.  This info<br>
&gt; might be implicit in a package-version&#39;s &quot;info.rkt&quot;&#39;s reference to a<br>
&gt; previous package-version, perhaps coming from an assertion of compatibility<br>
&gt; info.  This might be simpler than it might sound, but it has some<br>
&gt; interesting implications, including for forking and web-of-trust.)<br>
<br>
Again, this is addressed by no longer having Planet&#39;s treatment of<br>
versions and require specs.<br>
<br>
&gt; * Simple web-of-trust package-version public-key signing of package-versions<br>
&gt; (e.g., URLs plus hashes of contents), to start with, perhaps initially with<br>
&gt; only centralized repository for signatures.  Soon build distributed<br>
&gt; web-of-trust, plus multiple repositories so organizations have option to<br>
&gt; keep their signatures separate.  Build mechanisms atop that, including<br>
&gt; advancing the state of the art.<br>
<br>
I think package signing is something we&#39;ll eventually need, but I also<br>
don&#39;t think it&#39;s on the critical path.  It&#39;s also possible to add to<br>
the package system in the future.<br>
<br>
<br>
&gt; * Automate and simplify releasing in general.  With PLaneT, it&#39;s been<br>
&gt; not-unusual for even core Racket developers to avoid releasing some add-on<br>
&gt; code to PLaneT, perhaps because the clerical stuff was a headache.  For the<br>
&gt; old PLaneT, I was simplifying this with McFly, but with new a package<br>
&gt; mechanism, I would start with that and then ask what clerical parts still<br>
&gt; need help.  (For example, if doing development in an SCM repository that&#39;s<br>
&gt; accessed directly via require-specs, then releasing a package-version might<br>
&gt; consist mainly of adding a tag/label.  <a href="http://planet-lang.org" target="_blank">planet-lang.org</a>&#39;s directory might<br>
&gt; even update automatically, given info about a previously-released<br>
&gt; package-version of the same package-name.)<br>
<br>
The new system is much much much easier to release packages for.  For<br>
starters, this is a working package:<br>
<br>
    <a href="https://github.com/samth/add-blaster" target="_blank">https://github.com/samth/add-blaster</a><br>
<br>
You can install it with `raco pkg install<br>
github://<a href="http://github.com/samth/add-blaster/master`" target="_blank">github.com/samth/add-blaster/master`</a> (I hope we can make that<br>
command line shorter).<br>
<br>
Second, you can add this to `<a href="http://pkg.racket-lang.org" target="_blank">pkg.racket-lang.org</a>` with a few clicks.<br>
This can be automated once <a href="http://pkg.racket-lang.org" target="_blank">pkg.racket-lang.org</a> has an API. Further, it<br>
automatically updates when the GitHub repository changes.<br>
<br>
&gt; * Use submodule support to support single-file packages, at least for the<br>
&gt; HTTP/Git package-versions.  &quot;(module+ info ...)&quot;.  It seems from Emacs<br>
&gt; history that some people really like the single-file module, it lowers<br>
&gt; barriers, and now submodules give us an easy way to finally do it.<br>
<br>
This is potentially an interesting idea, although the info.rkt file<br>
format is quite restricted to enable reading it without running<br>
arbitrary code, and this might be hard to integrate with submodules.<br>
<br>
&gt; * Do whatever is necessary to avoid blocking the program for<br>
&gt; few/several-minutes while documentation is reformatted, when requiring an<br>
&gt; uncached package-version.  Maybe even moving it to an async process that&#39;s<br>
&gt; run when idle (Unix &quot;nice&quot;?) would work.<br>
<br>
First, the split between documentation and code for many packages will<br>
help here. Second, I think this is a lower-level issue than the<br>
package system -- in-tree builds have this issue too.<br>
<br>
Also, what program is being blocked here?  The installation process? DrRacket?<br>
<br>
&gt; * To put it vaguely: keep things simple in most cases, but don&#39;t dumb-down<br>
&gt; in practically restrictive ways, and keep an eye out for places to<br>
&gt; experiment with potential big wins for immediate practice or research.  Some<br>
&gt; things I just mentioned above would surely need refinement/exclusion based<br>
&gt; on this principle.  For another example, I heard some comments at one point<br>
&gt; about a package name being an interface, and multiple sources being able to<br>
&gt; provide implementations matching that interface.  I don&#39;t know the current<br>
&gt; plans for that, but I wouldn&#39;t make any special mechanism for that.  For<br>
&gt; another example, don&#39;t try to dumb-down package-names, as if the first<br>
&gt; person to make a package concerning the generic concept &quot;foo&quot; has the<br>
&gt; be-all-end-all package for all things &quot;foo&quot;.<br>
<br>
Package names aren&#39;t interfaces, but modules names (like `data/list`)<br>
can be thought of that way, and multiple packages can provide the same<br>
one.  However, this kind of overlap is discouraged.<br>
<br>
I&#39;m not sure what would be a less &#39;dumbed-down&#39; but still flat<br>
namespace. Do you have example suggestions?  The flat namespace has<br>
worked well with other languages with huge numbers of packages.<br>
<br>
&gt; * Some Web directory of software on &quot;<a href="http://planet-lang.org" target="_blank">planet-lang.org</a>&quot; (with JSON dump and<br>
&gt; maybe query), which includes both PLaneT packages together with the HTTP/Git<br>
&gt; packages that people have chosen to list in the directory.  It&#39;s a &quot;this is<br>
&gt; all the Racket packages we know about, and probably easier to find via<br>
&gt; search here than via Google.&quot;  (Eventually, this would be hooked up to the<br>
&gt; site-wide search feature for &quot;<a href="http://planet-lang.org" target="_blank">planet-lang.org</a>&quot;, together with other<br>
&gt; categories of other searchable Racket-related info that we identify.  Then<br>
&gt; DrRacket search could be hooked up to that.)<br>
<br>
Currently, `<a href="http://pkg.racket-lang.org" target="_blank">pkg.racket-lang.org</a>` doesn&#39;t include the contents of<br>
`<a href="http://planet-compat.racket-lang.org" target="_blank">planet-compat.racket-lang.org</a>`, but I suppose it could. It&#39;s already<br>
searchable.<br>
<br>
I hope that&#39;s helpful for clarifying some of the current design, and<br>
it&#39;s great to have feedback from a heavy user of Planet.<br>
<br>
Sam<br>
_________________________<br>
  Racket Developers list:<br>
  <a href="http://lists.racket-lang.org/dev" target="_blank">http://lists.racket-lang.org/dev</a><br>
</blockquote></div><br></div>