3 ms·
> Resolve your deps once, at build time, and you're done. I have ... rarely had this experience. Every go package manager has found new and frankly fascinatin
by jacques_chester 8y ago
> Resolve your deps once, at build time, and you're done.
I have ... rarely had this experience.
Every go package manager has found new and frankly fascinating ways to lead me into a corner where I think I have committed and pushed working code, but which causes highly-visible CI barfing.
I should add as an aside: I've done two tours of duty as a Cloud Foundry Buildpacks maintainer. Everyone's package system sucks, but some suck a lot less.
* Maven is basically sane if used with levelled starters. Otherwise it's a preview of fighting the Many-Tentacled Ones of the Deeply Nested Dependency Graph using nothing but a dull butter knife held upside-down.
* Gradle is the worst allergic reaction to XML in history.
* NPM used to have amazing bugs and missing features but has laboriously, slowly improved.
* Python is about whether you hit the sweet spot of the particular packaging system you use.
* PHP is a mess, unless you use Composer, in which case you're still stuck with the weird reality that PHP's package system is really a mix of in-process modules which need to be compiled and slabs of plain old PHP.
* .NET Core had what seems like a deliberate policy to come up with the most confusing naming and versioning scheme humanly possible and was wildly successful at doing so. Oh, and no canonical reference for versions. None. Apparently this improved but it was hell on earth.
* Golang. A new package manager every ten minutes. A different vendoring model, different assembly model, different bugs, every damn week.
Only Bundler is basically sane. We hit lots of corner cases but for the 20/80 cases it essentially worked.
- skywhopper 8y agoI think the point above was that once the binary is built you don’t have to worry about maintaining the exact same libraries on the server where they might be competing/mixing with various incompatible versions of shared libraries for Python or Ruby or whatever. That said, yes this is a shameful hole in the golang world (caused by the project leads’ inside-Google myopia) but I’m glad they are finally addressing it at this level of integration. And despite a few oddities it looks pretty solid.
- jacques_chester 8y ago> once the binary is built My view is that if it can't be built from scratch in a cleanroom environment -- ie, in CI or a buildpacks stager -- it can't be built. This goes for container images too. The amount of "works on my machine" and "where's Gerald? this module only builds on his laptop" I saw as a consultant was depressing. Speaking of containers, though: they solved the contending-interpreters problem quite handily. Cloud Foundry has used containerisation since before Docker existed and it really shines for buildpack usage. We started with Heroku's buildpacks, which had to deal with the nightmare of a pre-container world and showed all the pain of it. There was a great deal of stuff we just didn't have to care about and we later rewrote the bulk of the buildpacks to jettison all the stuff we didn't need. It's all come full circle: Heroku now use containerisation and both Heroku and Cloud Foundry will soon be adopting jointly-developed buildpacks-lifecycle code.
- vorg 8y ago> "where's Gerald? this module only builds on his laptop" Of course, "Gerald" is an anagram for "Gradle".
- jacques_chester 8y agoI'm going to pretend, just this once, that I was clever enough to do it on purpose.
- dnomad 8y agoI would agree except I find Maven to be easily the most sane and flexible and extensible build tool out there. I've used Maven to consistently build and deploy vast systems made up of hundreds of libraries. And this was ten years ago. Maven's only "flaw" is that it doesn't support incremental builds and, frankly, I've come to believe this isn't a flaw at all and incremental builds are an inherently unpredictable anti-pattern. (That might just be the Maven trauma speaking. There are tools out there like buck that claim to get incremental builds down perfectly but I have doubts and we've seen some strange bugs in buck builds.) What I find so strange is how the systems that came long after Maven -- particularly NPM and .NET -- that they could be so much worse than Maven. Somehow these people weren't aware of the importance of reproducible builds... despite that being a "thing" in Maven almost 20 years ago. Then, as noted above, you have go devs building off of git master branches. All of this suggests a real problem in software engineering. There's a distinct lack of knowledge sharing that does not lead to gradual, linear progress. It's quite disconcerting. Things are not getting better, every day, after all.
- jacques_chester 8y agoThese days I appreciate Maven much more than I did at first (ugh, XML, lolenterprisejava amirite??). But the whack-a-dep thing is a real, genuine painpoint. Spring Boot Starters make this fairly close to invisible, but there are still billions of lines of Java code where the POM is like the map of an incredibly fragile ceasefire between 813 variants of some 118 different dependencies at 18 levels of nesting. Like Game of Thrones, except bloodier, more complicated and much more likely to cause everyone to give up.