DepHell – Project Management for Python
dephell.org
dephell.org
I don't expect to have to click through to Github to get a summary of what your project's about. Consider putting some of the text from your readme onto the main project page, it's good copy and I think wants to be front and centre.
I went to the docs first to try to find this, but bounced off the terse three word descriptions and lists of verbs.
Good luck with the project!
We love DepHell. I migrated some work repos from Pipenv (and plain ol' pip) to Poetry. However, we didn't want to have a flag day where we updated our build tooling to be 100% Poetry, so I made a Makefile target that builds requirements.txt and setup.py from pyproject.toml. Now developers can work with pleasant tooling, but the build system can use the old stuff it already knows.
We're close to having everything migrated to Poetry. When that day comes, we can throw out all the compatibility stuff, update the build server, and be happy. Until that day, DepHell gives us an easy compatibility layer so that we don't have to do the migration all at once. It's awesome.
# Generate setup.py and requirements.py until we can get off that treadmill.
# This *must* be done every time you update dependencies, as pyproject.toml is
# now the official source of project configuration and packages.
python_oldfiles:
dephell deps convert; dephell deps convert --env requirements
and pyproject.toml blocks: [tool.dephell.main]
from = {format = "poetry", path = "pyproject.toml"}
to = {format = "setuppy", path = "setup.py"}
[tool.dephell.requirements]
from = {format = "poetry", path = "pyproject.toml"}
to = {format = "pip", path = "requirements.txt"}
Now when a dev does `poetry add foo`, they can run `make python_oldfiles` to autogenerate updated "compatibility" files.curl -L dephell.org/install | python3
* Trying 185.154.12.127:80...
* TCP_NODELAY set
* Connected to dephell.org (185.154.12.127) port 80 (#0)
> GET / HTTP/1.1
> Host: dephell.org
> User-Agent: curl/7.65.1
> Accept: /
> Referer:
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 301 Moved Permanently
you're begging to get owned at that point
JFC, I twitch every time I see this. "Download my script from my website and pipe it to python/perl/ruby". I want to "rm -rf /" people's computers just to stop this trend.
Please never do this! Always read the scripts you're going to run on your computer.
pip install this-or-that
do you actually first download the source and look at what takes place? probably not.In that sense curling is better as you can see the code beforehand just pipe it into a pager.
If "| curl" does this, it is basically normal to do anything. And root access is required in a lot of cases.
In practice, no. It is customary for "pip install" to not require root, and for "| curl" to require it.
"meteor.js" was a first relevant hit for curl|sh query on google. is javascript app platform. You are supposed to use "curl | sh" to install it ( https://install.meteor.com/ ). This file:
- Hardcodes install location to ~/.meteor (and removes previous location of it).
- Uses "sudo" to write to /usr/local/bin/meteor
Compare it with "scipy", which can be called a scientific app platform. It tells you to install via pip to user dir ( https://www.scipy.org/install.html ). It installs itself only to this dir, and nowhere else (I know it because I use it at work a lot, and we do pre-packaged virtualenv here). It is also using standard mechanisms -- if you want to have many version side-by-side, it is trivial.
Can you write |sh script so it minds its own business and only writes to a single directory? Yes. Do people do this? Not very often.
-----
When I wrote this, I thought: maybe I am biased towards curl|sh method because I don't know of one? So I want to HN front page, looked at last 210 entries, chosen every one which looks like a a software installable on a PC, and tried to evalalate the system impact:
- Dephell: curl | python, no side effects other than forced install location.
- neo.mjs: installed via node, presumably no side effects outside of node/project dir
- huginn: manual steps, all manual -- or docker. No surprises either way.
- ponylang: docker or PPA. No surprises.
- Poetry: installed via "curl|python", modifies my .bashrc to set PATH (to be fair, it told me about this afterwards...)
- Uni the unicode database: use "go get", no side effects
- Qt 5.1 -- commercial, "installer app".
- Virtualbox 6.1 -- installed via .deb file (system-wide but expected)
- event-driven-shell -- run from repo, optional "make install"
We've had 2 "curl |" apps. One of them was modifying my ~/.bashrc.
We've had 4 "traditional" apps -- which used "checkout repo and run command" method. None of them were writing stuff outside of their checkout dir. Some of them explicitly recommended that users change their .bashrc.
We've also had some docker apps and .deb-installed apps. Of them, virtualbox and Qt could write all over the places -- but they are much more "heavy weight" compared to other ones..
----
This is not a very big sample, but I think it is pretty representative. Once piping things into shell, it seems people cannot help but install stuff all over the place. It is just like "make install" was -- except it is not optional this time.
python setup.py
Do people ever open up setup.py to check the code and all that imports for side effects?As a matter of fact the construct makes it easier to inspect the code without running it:
curl -L dephell.org/install | more
I do understand the main concern though - that supposedly websites are easier to hack than a repository. It is also a valid concern that a hostile agent may serve different versions of the code to different people.But all those concerns apply when downloading code as well.When one needs to checkout and run setup.py, the packages are almost always nice -- they install packages and that's it. If the compiler is missing it fails. The worst I have seen is super confusing error message because of missing dependencies.
On the other side, I have seen `curl | sh` do completely insane things -- like install packages system-wide, mess with global PATH, create new users on the computers, remove random databases from localhost.
I suspect there are two reasons:
- checked out code can be inspected by random person just by clicking around on github site, every commit has a author name and a message. Feedback is simple and immediate -- there is the "create issue" button is right there.
- If someone tries to update my .bashrc from setup.py, it is pretty clearly a bug. It is unlikely to happen in the first place, and if it does happen, there will be plenty of users who can confirm it is a bad idea.
If someone tries to update my .bashrc from | curl site, it is not usually a bug. The maintainer will likely refuse to fix it, and claim something about user experience.
I consider this harmful advice. You're promoting a false sense of security, which I think anyone that's spent 10 minutes looking through an underhanded code contest can see.
If your threat model includes the packages you're installing, then you need to do multi-person audits, sandboxing, etc. This applies to software obtained from package managers as well, which aren't typically pre-audited (and let's not forget popular packages that have been hijacked or acquired and injected with malicious code).
Maybe that's why it is called DepHell instead of DepHeaven.
If you don't have access to clean Python interpreters that don't have "global modules", including in the user's own "site" directory, eventually you will be praying that your builds work.
For a system like "dephell" to have a chance of solving the problem that it tries to solve, it has to have a "place to stand from where to move the Earth" -- without it, it's just a faster way to trash your Python install and have to reinstall it.