comparison python/cheeseshop.txt @ 79:a599feff7c93

moving the cheeseshop document here; not the best place but it will work for now
author Jeff Hammel <jhammel@mozilla.com>
date Mon, 21 Jun 2010 13:16:24 -0700
parents
children
comparison
equal deleted inserted replaced
76:84ffa220796a 79:a599feff7c93
1 Making your own cheeseshop
2
3 It is a common misconception that the cheeseshop (pypi.python.org) is
4 *the* place to go for python packages. This is only true by
5 convention. I won't go into the history of
6 distutils/setuptools/distribute/pip packaging fiasco. Suffice it to
7 say that (I hope) things are slowly converging and that both pip and
8 easy_install, the two major ways of installing python software, both
9 support a -i option to specify the URL of the package index (which is,
10 by default http://pypi.python.org/simple).
11
12 In its base form, easy_install and pip just crawl links. You look at
13 the base URL (see above) /<package>/<package>-<version>-<extension>
14 and download this, unzip, run `python setup.py install` on it and
15 you're done. So if you want to make a cheeseshop, there are two
16 essential tasks:
17
18 1. Generating e.g. tarballs for a package and all of its dependencies
19 2. Putting these tarballs on the web with some appropriate parent
20 directory
21
22 Not rocket science...barely computer science, really.
23
24 For generating packages and their dependencies, I used pip. pip is
25 really great for this. I only used the command line interface, though
26 if I was smarter, I probably should have looked at the API and figured
27 out what pip is doing internally and I could have avoided a few
28 steps. Basically, using the --no-install option downloads the package
29 and its dependencies for you and lets you do what you want with it.
30
31 I made a program for this, see http://k0s.org/hg/stampit . It's a
32 python package, but it doesn't really do anything python-y. It was
33 just easier to write than a shell script for my purposes. Basically
34 it makes a virtualenv (probably overkill already), downloads the
35 packages and their dependencies into it, runs `python setup.py sdist`
36 on each package so that you have a source distribution, and prints out
37 the location of each tarball.
38
39 The source distribution is very important as we want packages that
40 will work independent of platform. These should. If they don't, we
41 can make them.
42
43 So problem #1 solved. Let's move on to problem #2: putting them
44 somewhere on the web.
45
46 Mozilla is so kind as to have given me a URL space on
47 people.mozilla.org. Since easy_install and pip are really dumb and
48 basically just crawl links, and since Apache is smart enough to
49 generate index pages for directories that don't have index.html files
50 in them, the hard part is already solved. I will note that
51 people.mozilla.org is not intended as a permanant place for these
52 tarballs, just an interim instance until we decide where we really
53 want to put them.
54
55 Since I like to write scripts, I wrote a script that will run stampit
56 and copy the resulting tarballs to a place appropriate to a
57 cheeseshop. You can see the code here:
58
59 http://k0s.org/mozilla/package-it.sh
60
61 The variables are pretty specialized to my setup, but of course that's fixable.
62
63 Does it really work?
64
65 Yes! You can try it for yourself. Try:
66
67 ``easy_install -i http://people.mozilla.org/~jhammel/packages/ mozmill``
68
69 Watch where the links come from. Surprise! They're all from
70 http://people.mozilla.org/~jhammel/packages/ !
71 I would *highly advise* doing this (and just about everything else in
72 python) in a virtualenv so that you don't pollute your global
73 site-packages.
74
75 Why am I doing this?
76
77 The Firefox buildslaves are supposed to fetch data only from mozilla
78 URLs for stability. So, if python packages need to be installed, they
79 need to be available internal to Mozilla. If a package didn't have
80 dependencies, then this is a no-brainer. But packages do have
81 dependencies. Mozmill depends jsbridge, simplejson, and mozrunner.
82 While this is a lot of work for just one package, if we want more
83 python stuff in our buildbot tests, we'll need to do more of this, and
84 I'd rather have a good solid methodology to do so. I also imagine
85 this growing as a place to put all of our python packages for internal
86 Mozilla needs.
87
88 I will note that I did this in a few hours from basically knowing the
89 problem space but never having actually done it. None of this is
90 supposed to be a clean and polished solution. But really, its not
91 bad. We did something similar but less functional at my last job, The
92 Open Planning Project, for similar reasons, so its not like I tackled
93 this blindly. This is not as fully functional as the cheeseshop. A maintainer
94 needs to run the package-it.sh script for each package (and its deps)
95 they want installed. There's no accounts or any of the other features
96 the cheeseshop has. But for a simple prototype and a way to move the
97 discussion forward, its actually not that bad of a solution. There
98 are more robust ways of really doing the cheeseshop, such as
99 http://github.com/ask/chishop , but for a package dumping ground, this
100 solution works and its really not even that hacky (in my opinion
101 anyway).
102
103