[HN Gopher] Switching from pyenv, rbenv, goenv and nvm to asdf
       ___________________________________________________________________
        
       Switching from pyenv, rbenv, goenv and nvm to asdf
        
       Author : tosh
       Score  : 420 points
       Date   : 2022-04-05 10:42 UTC (12 hours ago)
        
 (HTM) web link (jinyuz.dev)
 (TXT) w3m dump (jinyuz.dev)
        
       | js2 wrote:
       | > Everything was fine until I kinda felt my config.fish file got
       | bloated and somehow nvm was kinda slowing down my shell startup.
       | 
       | I'm quite happy with direnv to avoid this problem.
       | 
       | https://direnv.net/
       | 
       | Funny enough, it was submitted to HN most recently just
       | yesterday:
       | 
       | https://news.ycombinator.com/item?id=30908321
       | 
       | direnv is complementary to the various language-version tools, so
       | it obviates needing asdf:
       | 
       | https://github.com/direnv/direnv/wiki#project-layouts
       | 
       | But it seems some folks combine the two:
       | 
       | https://blog.mikecordell.com/2021/12/18/better-project-envir...
        
         | wyufro wrote:
         | Indeed, direnv and asdf integrates, such that PATH is set to
         | the values exposed by your .tool-config. This avoids the asdf
         | shim and makes executing the tools slightly faster. Good when
         | you have to run them over and over in a script.
        
         | kot-behemoth wrote:
         | I use direnv myself, and it's great. However, for anyone trying
         | it out I'd caution that it doesn't play well with conda - the
         | Python package management system (see this open issue
         | https://github.com/direnv/direnv/issues/326). It can be a
         | dealbreaker for some.
        
         | sph wrote:
         | direnv is a killer tool in my arsenal. Writing 12 factor apps
         | without it (especially managing configuration) is an exercise
         | in pain and frustration.
        
         | qbasic_forever wrote:
         | direnv is nice but it really makes me uneasy if it catches on
         | for modern collaborative development.
         | 
         | You are giving people a _ton_ of trust when cloning a repo or
         | pull request that has a .envrc which will be automatically
         | executed by direnv. This file could do anything from steal your
         | SSH keys to delete your entire home directory or worse. And the
         | only thing preventing that from happening is the suggestion of
         | "oh be sure to eyeball the .envrc file and make sure it looks
         | ok, then run this command to enable it". People will just
         | google for the first "how to I unblock .envrc file" and blindly
         | run the command, then oops. Or a determined attacker will just
         | obfuscate what they're doing so the .envrc looks fine but you
         | failed to realize some esoteric bash-isms were actually
         | invoking an obfuscated script and... oops. It's just begging
         | for a supply chain disaster on a similar scale as npm's
         | infamous issues.
         | 
         | VS code and some vim extensions have similar issues with
         | automatic project-specific configurations that allow arbitrary
         | code execution too, and neither have a good solution beyond
         | 'just read all the code and understand it to make sure it's not
         | going to hurt you'. It's not really a unique thing to direnv.
         | 
         | We really need a better model for collaboration and consistent
         | dev environments. I think containers and docker/chroot/etc.
         | environments with explicit opt in of your local resources,
         | configs, files, etc. are a much more sane and security
         | conscious path towards it. A script executing to setup my
         | python environment for a project should never, ever have access
         | or even know about my personal password store database for
         | example (unless I explicitly decide it should).
        
           | Nextgrid wrote:
           | Direnv maintains a local cache of the scripts it's allowed to
           | execute. It will not execute a brand new script and instead
           | ask you to manually run "direnv allow".
        
             | qbasic_forever wrote:
             | Yes, that's why I explicitly mentioned this:
             | 
             | > And the only thing preventing that from happening is the
             | suggestion of "oh be sure to eyeball the .envrc file and
             | make sure it looks ok, then run this command to enable it".
             | People will just google for the first "how to I unblock
             | .envrc file" and blindly run the command, then oops. Or a
             | determined attacker will just obfuscate what they're doing
             | so the .envrc looks fine but you failed to realize some
             | esoteric bash-isms were actually invoking an obfuscated
             | script and... oops.
             | 
             | You need to be absolutely sure you've read and understand
             | every single line in the .envrc file, and every single line
             | in any script it may be invoking, before you run direnv
             | allow. Otherwise you are giving code from the internet a
             | blank check to do anything on your machine with your user
             | account.
             | 
             | I personally do not think bash/shell is a sensible language
             | to trust that you can quickly or easily determine from a
             | visual check alone if a script might be doing nefarious
             | things.
        
               | Nextgrid wrote:
               | I use direnv to source environment variables - the only
               | scripts I use it for consist of "export" statements.
               | Anything beyond that and I'll be questioning it.
               | 
               | Sure, you can trick idiots into running malicious code,
               | but I don't think you need direnv for that - any pip/npm
               | install can run anything and so does curl|bash.
        
           | hardwaresofton wrote:
           | I don't include the env file in the source, but rather
           | include a sample in the README.
           | 
           | If I wanted to include it, I use something like git-crypt and
           | encrypt the contents
        
           | DandyDev wrote:
           | direnv actually won't run anything until you explicitly allow
           | it to. And if the .env file changes, you have to re-allow
           | direnv to read and execute it.
           | 
           | Seems safe to me
        
             | qbasic_forever wrote:
             | Unfortunately like the other comment you didn't read what I
             | said and my concern about this approach. Please see my
             | response: https://news.ycombinator.com/item?id=30922199
        
       | smokey_circles wrote:
       | what in the actual horrifying toolset is this.
       | 
       | pyenv I can understand. dunno the others.
       | 
       | but goenv?? you deserve whatever hell this is. it's a single
       | binary configurable with an envvar for gopher sake. just RTFM.
        
       | trey-jones wrote:
       | I see comments about Nix and I've heard rumblings about it
       | before, so I might look into that. But Docker covers my needs for
       | version management completely. To me it seems much more explicit,
       | more portable, less error prone, less complex than any of these
       | virtual environment managers. Never mind that I don't even want
       | node.js on my system if I can help it at all (I can't,
       | generally).
        
         | hushpuppy wrote:
         | Docker doesn't allow for LSP servers in my text editor. Asdf
         | "just works".
        
           | trey-jones wrote:
           | This is a reasonable point, and something that is being
           | worked on. I definitely think Docker _can_ provide LSP
           | servers as necessary, we 're just not quite there. This is
           | something that I'm interested in working on, though I'm not
           | the only one: https://github.com/emacs-lsp/lsp-docker
           | 
           | For the most part, latest version linting is good enough for
           | me, currently.
        
         | dlisboa wrote:
         | It's obviously doable, but it's _very_ heavy for languages.
         | Like someone else said, you immediately run into basic issues
         | like readline, LSP compatibility, volume persistence, port
         | forwarding, etc.
         | 
         | Docker is better for version managing services like databases,
         | caches (Postgres, Redis, etc), things that have little need for
         | different configuration or exploration and persist through
         | multiple sessions. Once they're up, they're done.
         | 
         | Asdf is the next best thing for local development, where you
         | need that kind of exploration.
        
         | rkangel wrote:
         | The main issue with docker is that you have to start from
         | scratch with your environment. With Nix you can layer it over
         | your existing Linux environment (or you can have it from-
         | scratch by running `nix-shell --pure`).
         | 
         | There are advantages to the docker approach, and Nix can be
         | painful to get going, but a significant portion of the
         | community (including me) find the pain to be worth it.
        
       | samgranieri wrote:
       | I've used ASDF since 2016 and it's been working beautifully. The
       | only hiccups I've had with it aren't related to ASDF, rather
       | stuff like Erlang 24.0 not compiling on macOS (which was
       | subsequently fixed). Every engineer at my company uses ASDF
        
         | vlunkr wrote:
         | Same. We switched when we started an elixir project and pretty
         | quickly switched all our codebases over. On top of languages
         | we've used it for database systems in some cases.
        
           | freedomben wrote:
           | asdf is indeed the best solution in the elixir/erlang world.
           | I use it for node, ruby, and python now too and it's been
           | great to have a consistent experience across languages.
        
       | vmception wrote:
       | asdf for solution to package manager hell? missed opportunity for
       | naming it fgsfds
        
       | blunte wrote:
       | Happy asdf user for several years now. Unfortunately, there are
       | still cases where it either can't be used or it would take a
       | great deal of hacky stuff to make it work. One such case is
       | getting PyCharm to understand it.
       | 
       | I found it works well for Ruby, Elixir/Erlang, and Node.
        
         | pmontra wrote:
         | And PostgreSQL too. I tend to use the PostgreSQL plugin for
         | projects in which I use asdf. It creates the data directory
         | somewhere and I can use that exact version of the database
         | without docker. Then it's pg_ctl start / stop from within the
         | project directory. The version coming with the OS is never the
         | right one.
        
       | burke wrote:
       | At Shopify, we do a similar thing using a tool we wrote called
       | Shadowenv[1], which evaluates little programs to manipulate the
       | environment on directory entry/exit. It's a lot like direnv, but
       | it can't do anything that makes it slow, and is guaranteed to run
       | in at most 100ms (though it typically only takes a few)
       | 
       | When I set `ruby: 2.6.8` in my `dev.yml` file, for example, I get
       | this Shadowenv program written out to
       | `.shadowenv.d/550_dev_ruby.lisp`:                   (provide
       | "ruby" "2.6.8")              (when-let ((ruby-root (env/get
       | "RUBY_ROOT")))          (env/remove-from-pathlist "PATH" (path-
       | concat ruby-root "bin"))          (when-let ((gem-root (env/get
       | "GEM_ROOT")))            (env/remove-from-pathlist "PATH" (path-
       | concat gem-root "bin")))          (when-let ((gem-home (env/get
       | "GEM_HOME")))            (env/remove-from-pathlist "PATH" (path-
       | concat gem-home "bin"))))              (env/set "BUNDLE_PATH" ())
       | (env/set "GEM_PATH" ())         (env/set "GEM_HOME" ())
       | (env/set "RUBYOPT" ())         (env/set "RUBYLIB" ())
       | (env/set "RUBY_ROOT" "/opt/rubies/2.6.8")         (env/prepend-
       | to-pathlist "PATH" "/opt/rubies/2.6.8/bin")         (env/set
       | "RUBY_ENGINE" "ruby")         (env/set "RUBY_VERSION" "2.6.8")
       | (env/set "GEM_ROOT" "/opt/rubies/2.6.8/lib/ruby/gems/2.6.0")
       | (when-let ((gem-root (env/get "GEM_ROOT")))
       | (env/prepend-to-pathlist "GEM_PATH" gem-root)
       | (env/prepend-to-pathlist "PATH" (path-concat gem-root "bin")))
       | (let ((gem-home               (path-concat (env/get "HOME")
       | ".gem" (env/get "RUBY_ENGINE") (env/get "RUBY_VERSION"))))
       | (do             (env/set "GEM_HOME" gem-home)
       | (env/prepend-to-pathlist "GEM_PATH" gem-home)
       | (env/prepend-to-pathlist "PATH" (path-concat gem-home "bin"))))
       | 
       | I really like this strategy. It's really nicely generalizable to
       | any of these language runtimes that need to change on a per-
       | project basis.
       | 
       | [1]: https://shopify.github.io/shadowenv/
        
         | ravi-delia wrote:
         | Oh I like the look of this. Can't wait to try it out
        
       | this_is_not_you wrote:
       | I've wasted so much time trying to get pyenv to work properly and
       | failed. Switched to asdf and things just worked.
        
       | rsanheim wrote:
       | I switched to using asdf away from nvm/rbenv for a few projects
       | in about a couple hours of time, and that included the
       | install/build time for various versions of things and the time to
       | re-run bootstrap and verify things worked from a fresh clone.
       | 
       | It was really impressive how smooth and quick the process was.
       | Great tool!
        
       | twblalock wrote:
       | It seems like a lot of these virtual environment tools are
       | designed to work around the assumption that packages are
       | installed globally on a system.
       | 
       | I don't see why this is so hard to avoid with per-project version
       | pinning. I've never had this problem with Java.
       | 
       | This seems like a lot of effort and complexity to work around
       | global package installation. Just stop assuming that packages are
       | global and this would all go away. How do we know that? Because
       | other languages don't require this kind of workaround!
        
         | nicoburns wrote:
         | It's less about package versions (which are indeed versioned on
         | a per-project basis in sane ecosystems - python being a notable
         | exception) and more about versions of the language toolchain
         | itself. e.g. you might want one project on Java 17 and another
         | on Java 8. These tools allow you to seamlessly switch between
         | those.
        
           | twblalock wrote:
           | Java tooling already provided that and it's trivial to
           | install multiple JDK versions on a system. I probably have 4.
           | Most IDEs have a dropdown to pick the one you want, there are
           | CLI tools for it too, and overall it's about as complex as a
           | $PATH variable.
           | 
           | It's also possible to install multiple versions of Python on
           | a system. The dependency management is the real problem --
           | having more than one version of a runtime is not the hard
           | part.
        
             | nicoburns wrote:
             | If Java provides good first-party support for this then it
             | may not make sense to use asdf for Java. Rust is similar in
             | that rustup is first-party the recommended tool to install
             | Rust with. I don't bother with asdf for Rust. Other
             | ecosystems like python/ruby/javascript don't provide this
             | as a first party tool meaning there are lot's of 3rd party
             | alternatives. For these ecosystems asdf is nice in that it
             | allows you to use one tool across all the ecosystems.
             | 
             | > The dependency management is the real problem
             | 
             | I'm not sure how this works in Java, but in many ecosystems
             | like JavaScript and Rust dependency management isn't an
             | issue at all. Installing a package defaults to a local
             | install and even things like dependencies transitively
             | depending on different versions of the same package are
             | supported out the box and just work.
        
           | smoe wrote:
           | What do you refer to by saying Python is an exception? I
           | haven't used anything but different language and package
           | versions on a per-project basis since around 2007. I had some
           | project with deployments on client servers where their
           | sysadmin insisted on having everything installed as os
           | packages, but this at least from my perspective hasn't been
           | the norm for quite a while now.
           | 
           | Not to say that I like the Python package management story.
        
             | nicoburns wrote:
             | Commonly used tools like virtualenv allow you to do this,
             | but it's not the default in the python ecosystem: `pip
             | install foo` will install foo globally. In most other
             | ecosystems the equivalent command (e.g. npm install foo)
             | defaults to a local install with no effort on your part.
        
         | tootie wrote:
         | Java (well Maven) I believe does this the most clever and
         | simple way. It does have a global folder of dependencies but
         | will gladly stash multiple versions of the same library. Local
         | projects just link to the right version. That saves downloads
         | and allows for simple version pinning. And JVMs are backwards
         | compatible so having a new JVM can still run bytecode for past
         | versions with just a flag. Features like this are so much more
         | valuable than anything that goes into the actual language
         | syntax.
        
           | npteljes wrote:
           | I come from the Java world and it's mindblowing to see that
           | mature, widespread languages like Ruby, Python or JavaScript
           | require all kinds of hackery to run properly. Dependency
           | management with Maven is a breeze in comparison.
        
             | __MatrixMan__ wrote:
             | I only spent two years in contact with Java. I was
             | initially very pleased with how easy dependency management
             | was but it soured over time.
             | 
             | I'd respond to production disasters with hacky bash scripts
             | and then we'd spend the next sprint incorporating that
             | functionality into the server so the hacks weren't
             | necessary. We kept catching ourselves working really hard
             | to optimize what we thought at first needed to be custom
             | code but what ended up being easily achievable by leaning
             | on well-known non-java tools like `diff`. There's something
             | about the way Javs encapsulates everything into a JAR that
             | discourages Java devs from using anything on the outside.
             | 
             | If you can live in a world where everything you need is in
             | the JAR, life is good, but that hasn't frequently been my
             | world.
        
               | tootie wrote:
               | I spent many years working with Java and never used bash
               | for deployment. Maven covers all the bases. And when you
               | have something really custom, you write a maven plugin.
               | Which can also be managed with Maven.
        
               | __MatrixMan__ wrote:
               | Oh the bash scripts had nothing to do with deployment,
               | they just fixed the data that the buggy deployment
               | created.
               | 
               | It's only relevant because the high level of
               | encapsulation that made deps easy to manage also
               | represented a barrier. Using diff and awk was fast
               | enough, the reimplementation in java wasn't (happened
               | just a few times). Language ecosystems with a more
               | permeable encapsulation style make it easier to reference
               | tools outside of that ecosystem at the cost of making it
               | harder to get your deps straight.
        
             | robertlagrant wrote:
             | Bear in mind basically one guy maintains the Python package
             | installer and default packages repo, or at least he did for
             | many years. It's open source.
        
             | Tainnor wrote:
             | What do you mean by Ruby "hackery"?
             | 
             | I'll agree that how to do things properly with Ruby isn't
             | obvious when you're new to the language - just as it isn't
             | obvious how to do things in Java (or other JVM languages)
             | when you're coming from Ruby or another language.[0]
             | 
             | But Bundler doesn't work all that differently from Maven,
             | in the end. Instead of running your commands through
             | `./mwnw`, you run them through `bundle exec`[1]. Dependency
             | management is straightforward and mostly hassle-free (the
             | problems arise "only" when you use C extensions which, to
             | be fair, is not that rare, but I don't really see a way
             | around this in a language where you need C for certain fast
             | things). In particular, Bundler by default[2] _also_ stores
             | dependencies centrally like maven to avoid duplication and
             | then selects the appropriate version of a given dependency
             | (unlike e.g. NPM which stores everything locally).
             | 
             | Rbenv (or alternative tools such as chruby or asdf) solves
             | a problem completely distinct from Bundler or Maven, it's
             | about selecting _the right Ruby version_ for your project,
             | a problem that also needs to be solved with Java. IME, many
             | developers just let the IDE deal with that, but Ruby
             | developers are more used to running things from CLI, so
             | that 's why rbenv exists. In any case, the most popular
             | analogue for Java would be sdkman which works, mostly, the
             | same way (and which, IME, is even a bit hackier than
             | rbenv).
             | 
             | JS and Python are different. Node is a mess IMHO, and
             | Python isn't able to agree on which package manager to use
             | (I would hope people would migrate to Poetry, which seems
             | to be doing things right).
             | 
             | [0]: For example, one thing that I find very annoying over
             | in Java-land is that it's a real hassle to make sure things
             | behave the same way when called from the CLI as opposed to
             | from the IDE, such as setting the active spring profile.
             | This is because, mostly, the IDE circumvents maven/gradle
             | (you _can_ run things through the build system, but
             | typically the output, e.g. test output, is better when
             | using the IDE-internal system, at least with IntelliJ).
             | 
             | [1]: There are "hackeries" to get rid of having to run
             | everything through "bundle exec", such as binstubs and
             | direnv, although I would mostly call them "shell script
             | tricks", and anyway, if you instead just alias "bundle
             | exec" to something shorter or create a wrapper script, it's
             | not really worse than `./mwnw`.
             | 
             | [2]: This can be overriden and is actually a good idea for
             | production builds, especially if you use a multi-stage
             | docker build since then it's easy to copy over all your
             | dependencies.
        
               | npteljes wrote:
               | By Ruby, Python and JavaScript hackery I was meaning rvm,
               | venv / pip, and npm. I have the most experience with rvm,
               | and the hackery part comes from the experience when I
               | created a web interface that could instruct the server to
               | do ruby tasks. Turned out that rvm (and also bundler)
               | does a bunch of stuff to the environment of the user,
               | that's sometimes inaccessible, even if you invoke a
               | "login shell" programatically. One of these "hacks" is
               | doing a bunch of stuff when the user navigates to a Ruby
               | project directory with cd, which is when rvm creates or
               | uses the existing virtual env for the project - named is
               | a specific way based on the directory name. I solved this
               | of course but the discovery was quite annoying.
               | 
               | Regarding Python, I don't have much experience, other
               | than the general feeling that it's fragile and that
               | specific projects work with specific dependency
               | managegers / virtual environments, and they are not
               | really interchangeable or anything. I either could
               | replicate the env or I couldn't. I definitely don't have
               | much of a Python experience.
               | 
               | Now regarding your Java IDE annoyance, I share the same
               | experience. Also the case with Tomcat. IDEs do so much
               | hackery so that user experience is convenient, that you
               | would be hard pressed to replicate the results, and often
               | need to test both because it just doesn't work the same
               | way, due to the different dependencies used, deployment
               | method etc.
               | 
               | Now that I think about it, every single one of the
               | programming ecosystems I used were quite annoying.
        
               | Tainnor wrote:
               | > By Ruby, Python and JavaScript hackery I was meaning
               | rvm, venv / pip, and npm. I have the most experience with
               | rvm, and the hackery part comes from the experience when
               | I created a web interface that could instruct the server
               | to do ruby tasks. Turned out that rvm (and also bundler)
               | does a bunch of stuff to the environment of the user,
               | that's sometimes inaccessible, even if you invoke a
               | "login shell" programatically. One of these "hacks" is
               | doing a bunch of stuff when the user navigates to a Ruby
               | project directory with cd, which is when rvm creates or
               | uses the existing virtual env for the project - named is
               | a specific way based on the directory name. I solved this
               | of course but the discovery was quite annoying.
               | 
               | Keeping the "right context" when you do things in
               | different directories with the same shell config is,
               | unfortunately, a problem that I don't think is easy to
               | solve. My preferred approach is to use direnv
               | (https://direnv.net/), but that's not perfect either.
               | 
               | As for rvm, I think that a lot of people at some point
               | discovered that rvm was maybe doing a bit too much (in
               | particular, it would also manage gem sets, something that
               | seems superfluous with Bundler). I think that's a reason
               | why rbenv and chruby emerged as lighter-weight
               | alternatives which are _a bit less_ magic. I haven 't
               | seen many people use rvm anymore in recent years. By
               | contrast, Bundler doesn't really do anything to your
               | shell.
               | 
               | > Now that I think about it, every single one of the
               | programming ecosystems I used were quite annoying.
               | 
               | That's something I agree with. As a more recent convert
               | to the JVM world (and mostly just for lack of better
               | alternatives), I'm still sometimes annoyed at the IDE-
               | centrism (and UI-centrism, see also sonarqube) in this
               | space. Luckily, things are already better than they were
               | when I learned Java in university and "it runs in my IDE"
               | was the default state of affairs...
        
               | npteljes wrote:
               | Thanks for the suggestions. I'll look into direnv, as I
               | only heard about it, but never really investigated.
               | 
               | If people don't use rvm, do you know what they use to
               | install a specific Ruby version? We basically use it so
               | that we can use a Ruby that's not bundled with the
               | distros anymore (large legacy project).
        
               | tootie wrote:
               | I think you're missing that Maven does actually solve the
               | rvm/nvm/pyenv problem. You can specify the bytecode
               | version in the config and compile/run any backward
               | compatible version. Your actual JDK need only be new
               | enough, not an exact match and it doesn't need to change
               | between projects. I have never had a single compiler or
               | runtime version compatibility issue even with native
               | dependencies ever with Java. The IDE situation can have
               | some subtle edge cases, but no other language (save C#)
               | actually gains so much utility from an IDE. Stack traces,
               | break points, runtime inspection and profiling are all
               | nearly flawless in IntelliJ (or Visual Studio) in ways
               | that are monstrously difficult with any dynamic language.
        
               | Tainnor wrote:
               | Yes, but now you're not comparing maven vs. Bundler,
               | you're comparing statically vs. dynamically typed
               | languages. It's almost impossible to get the strong
               | guarantees you get in a statically typed language in a
               | dynamically typed one.
               | 
               | If that's the discussion you want to have, well, I
               | personally also prefer statically typed languages, but
               | that's beyond the point.
               | 
               | That said, I've _had_ issues, e.g. on CI, that didn 't
               | manifest locally because of a mismatch in Java versions
               | (something with JAXB, IIRC), and Java is maybe sometimes
               | a bit too cavalier about the issue.
        
               | oftenwrong wrote:
               | The Maven ecosystem partly solves the "the _right_ java "
               | problem, although it's not necessarily well known and not
               | particularly great.
               | 
               | 1. For selecting the correct JDK to use with standard
               | plugins, including the compiler plugin, there's support
               | for toolchains:
               | 
               | https://maven.apache.org/guides/mini/guide-using-
               | toolchains....
               | 
               | 2. For ensuring Maven itself is run with the correct JDK,
               | it is a commom recommendation to use the Enforcer plugin
               | to specify the required JDK version and/or vendor, as
               | well as the Maven version:
               | 
               | https://maven.apache.org/enforcer/enforcer-
               | rules/index.html
               | 
               | 3. It is increasingly common to use Maven Wrapper to
               | supply Maven, which you seem to be aware of.
               | 
               | 4. Maven will run with the JDK pointed to by JAVA_HOME,
               | of course.
        
       | twic wrote:
       | So is asdf good then? I have been using SDKMAN! to install JDKs,
       | but i noticed that Gradle will automatically detect JDKs
       | installed using SDKMAN!, asdf, and Jabba [1], which signals to me
       | that the other two are worth a look. Although now i dig into it,
       | asdf does not have a first-party Java plugin, so the support is
       | through a third-party plugin maintained by three people and a
       | robot [2].
       | 
       | [1]
       | https://docs.gradle.org/current/userguide/toolchains.html#se...
       | 
       | [2] https://github.com/halcyon/asdf-java/graphs/contributors
        
         | e12e wrote:
         | TBH I've had a bit mixed experiences with asdf and java (mostly
         | big enterprise apps like Oracle SQL Developer needing some
         | hand-holding to work properly, and issues with http kit
         | intercepting network traffic used by SoapUI).
         | 
         | Not sure the error lies at the feet of asdf, though.
         | 
         | For ruby/node it's a relief to be able to easily "activate" a
         | certain version of ruby _and_ a certain version of nodejs - at
         | the same time, via simply  "asdf local ruby ... and asdf local
         | node ...".
        
         | SingAlong wrote:
         | I wouldn't go by whether a plugin is first-party or third-
         | party.
         | 
         | The only plugins under the asdf-vm github org are for Ruby,
         | Node.js, Elixir and Erlang, because those are the only
         | languages I needed.
        
         | vips7L wrote:
         | Jabba never worked on windows for me. So now I just install
         | jdks globally via scoop and have a powershell plugin that
         | automatically detects a .env file in each directory.
        
       | kbd wrote:
       | Tried asdf but can't stand the global shims. I only want it to
       | work on a per-directory basis with direnv. I tried to follow the
       | asdf-direnv instructions but IIRC still wound up with asdf's shim
       | directory in my global PATH, and it needed to install its own
       | copy of direnv. Disappointing that asdf expects to take over my
       | system like it does.
        
       | vorticalbox wrote:
       | the nodejs plugin fails on version asdf v0.7.8 use v0.8.0 or
       | higher to avoid the unbound variable error
        
       | oauea wrote:
       | The link to adsf-vm just points to Google. Is this a broken link,
       | or just wasting the readers time by telling them to "just google
       | it"?
        
         | tosh wrote:
         | https://asdf-vm.com
        
       | rubyist5eva wrote:
       | asdf is wonderful, been using it for 2 years and get everyone I
       | see using one of those single-language tools to switch and they
       | also love it.
       | 
       | if asdf could have a plugin that hooks into their shims to also
       | handle direnv I would be in heaven
       | 
       | edit: just did a quick google search and it exists, i'm elated
        
       | orsenthil wrote:
       | I like this quote in asdf help.
       | 
       | "Late but latest" -- Rajinikanth
       | 
       | https://github.com/asdf-vm/asdf/blob/master/lib/commands/com...
       | 
       | Thalaiva! :)
        
       | whalesalad wrote:
       | I think of myself as a pretty experienced hacker but asdf has
       | never really worked for me on any platform. It's always a kludge.
       | Love the idea, but I'm sticking with pyenv for now.
        
         | this_is_not_you wrote:
         | Funny, had the exact opposite experience. I could pyenv not get
         | to work with my Linux VM and VSCode terminal (zsh).
        
       | CraigJPerry wrote:
       | I just raided the project git repo and there is definitely no
       | common lisp in there. Unfortunate name clash!
       | 
       | https://asdf.common-lisp.dev/
        
         | chobytes wrote:
         | My first thought as well! From the title I was intrigued to see
         | how CL was being used for this.
        
         | omaranto wrote:
         | Renaming because of this name clash has been suggested but the
         | suggestion wasn't taken up:
         | 
         | - https://github.com/asdf-vm/asdf/issues/383 -
         | https://github.com/asdf-vm/asdf/issues/547
         | 
         | They did do something to ameliate this though: now they refer
         | to the proect as asdf-vm as much as possible, to distinguish it
         | from Common Lisp asdf.
        
         | peterhil wrote:
         | My first reaction was to see if the project is made with
         | Commnon Lisp's ASDF, and cool now it has plugins for different
         | languages. Common Lisp ASDF is very well thought out, but not
         | the easiest package management system.
        
           | ravi-delia wrote:
           | Yeah I was really wondering who found it easier to hack ASDF
           | to work with other languages than just use a few separate
           | package management solutions. It's an incredible library, but
           | man I would not want to push its limits or it would go from
           | odd to unusable pretty quick.
        
       | ClumsyPilot wrote:
       | I am sorry for off-topic, but it i show this title to a normal
       | person, they will conclude that our industry is a joke.
        
       | tptacek wrote:
       | I get pyenv and rbenv. I do not get why anyone would use goenv.
       | I'm sure there's some corner-casey reason, but it's not a
       | mainstream thing. I can't imagine working in Ruby or Python
       | without wrappers, but Go, just keep the most recent version
       | installed and that's pretty much it. If you're new to Go and
       | installing something like goenv because you had to do that for
       | all the other languages... reconsider!
        
         | EscargotCult wrote:
         | +1 the only thing that's "surprised" me between Go releases has
         | been their changes to build flags in 1.18, and gofmt takes care
         | of that anyway. Now that I think of it, gofmt changes if you
         | have autoformatting enabled is probably the only "breaking"
         | change that might happen between minor releases, but I haven't
         | seen any issues with this from 1.15 through 1.18. In any case,
         | if gofmt changes are disruptive enough to block upgrading, then
         | a team has some deeper-seated issues in how they ship.
        
         | ryanschneider wrote:
         | I'm not sure if this is a feature or bug but `asdf` requires
         | you to recompile every tool installed via `go install` (nee `go
         | get`) when you change go versions.
         | 
         | IIRC the main reason our team started tracking go versions was
         | we were already using `asdf` for tracking other tools and it's
         | a nice way to ensure that everyone/everything was using the
         | same to version (e.g. for unit tests which usually aren't run
         | in a container) but it is another spot to keep in sync with the
         | Dockerfile.
        
       | wyuenho wrote:
       | asdf is not a replacement for pyenv, rbenv, goenv and nvm, it's
       | yet another abstraction on top of them. Nvm is a fork of rbenv
       | for node, and pyenv is a fork of rbenv for python, the core of
       | all of these asdf plugins are exactly ruby-build, python-build
       | and node-build, which came from rbenv, pyenv and nodeenv. For go,
       | you don't need any kind of environment, you can switch between
       | versions with just a change of an environment variable. Also, a
       | much simpler solution is to simply install these language runtime
       | versions with your favorite package manager like Homebrew or
       | Macports, and use direnv and dotenv to switch between them as you
       | cd into different directories. All of these languages have
       | convenient environment variables you can control to put the right
       | things in your paths.
        
         | jitl wrote:
         | Nit: nvm is fork of rvm. nodenv is fork of rbenv. The rbenv
         | model works much better than nvm model because it uses PATH
         | executables instead of heavy shell functions.
         | 
         | Regarding the suggestion to "do things manually" -- what is the
         | value of doing things manually? For me, it is very far away
         | from how I want to spend my energy, which is doing computer
         | things that only I can do. I am happy to outsource environment
         | variable fiddle faddling to someone else.
        
           | wyuenho wrote:
           | Configuration is a necessity for any tooling. Direnv is
           | something you likely already use with dotenv anyway to
           | configure your CI/CD pipelines. All you need to do is to drop
           | in a few more extra environment variables into your git
           | worktree.
        
         | lapser wrote:
         | > asdf is not a replacement for pyenv, rbenv, goenv and nvm,
         | it's yet another abstraction on top of them
         | 
         | No, asdf is a replacement for them. It's not an abstraction on
         | top of them. It uses its own plugin system, and everything is
         | written purely in bash. Everything gets installed in
         | `~/.asdf/installs`
        
           | wyuenho wrote:
           | Their "plugins", are using exactly the same build plugins
           | pyenv, rbenv and nodeenv use to build the language runtimes.
           | All asdf does is set the point things to the right
           | directories using various tricks like symlinks and shims and
           | whatnot. This is something easily accomplished by direnv.
        
             | rubyist5eva wrote:
             | https://github.com/asdf-community/asdf-direnv
             | 
             | > asdf version resolution is slow which makes every command
             | execution pay that penalty. asdf reshim is needed for
             | finding new executables, and some tools are not happy with
             | their executables being masked by shims.
             | 
             | > Perform asdf version resolution only once and defer
             | environment loading to direnv.
        
               | wyuenho wrote:
               | Exactly the reason to use direnv directly.
        
               | rubyist5eva wrote:
               | but then I still have to use some kind of package manager
               | to manage multiple language runtime versions and
               | brew/apt/dnf are all woefully inadequate
        
         | mjs wrote:
         | I also prefer `direnv`. I am not entirely sure how `asdf`
         | actually works; `direnv` is pretty straightforward: it hooks
         | into the shell and modifies environment variables. (`PATH`, but
         | also tool-specific variables if required.) So it's pretty easy
         | to debug or replicate by hand if necessary.
         | 
         | It can't actually install different versions though (looks like
         | `asdf` can?), which is somewhat inconvenient.
        
           | wyuenho wrote:
           | Just install them with Homebrew or Macports. They all get
           | installed into different paths anyway and you don't even need
           | to build from source on your system. Building python and node
           | are major PATA.
        
         | vlunkr wrote:
         | > install these language runtime versions with your favorite
         | package manager like Homebrew or Macports
         | 
         | Package managers often don't have a way to install specific old
         | versions of a package, or multiple versions of a single
         | package. That's the whole point.
        
           | wyuenho wrote:
           | Yes there is, but may not be granular enough to the patch
           | level, they usually end at the major or minor level. But then
           | again, I've never ran into or heard of anyone that needs a
           | very specific semver of a language runtime for a project. It
           | could happen, and when it does, you switch to pyenv, rbenv or
           | nvm. There's still not a reason to use asdf, as a poster
           | pointed out, asdf version resolution is slow and you need to
           | reshim, which is yet another manual intervention you'll need
           | to do.
        
       | bin_bash wrote:
       | I used asdf but found it caused a 200ms hit to launching any of
       | the binaries: https://github.com/asdf-vm/asdf/issues/290
       | 
       | Personally that's not something I can live with as these binaries
       | are sometimes launched many times in subprocesses.
        
         | lapser wrote:
         | Seems the direnv plugin aims to resolve, but I struggled to get
         | it working. 200ms for hasn't been a huge issue (yet), but not
         | having the proper paths set up has been. Using shims isn't the
         | greats experience (something direnv plugin also aims to
         | address).
        
           | thejosh wrote:
           | direnv worked for me on both linux/mac.
           | 
           | They just released a major new version (asdf-direnv), so
           | might be worth giving that a shot and see if it works for you
           | with asdf?
        
           | noitpmeder wrote:
           | Direnv is actually amazing
        
             | samgranieri wrote:
             | yeah, I love direnv combined with bundler binstubs. saves
             | me from having to type bundle exec (whatever), or even
             | using a shell alias for it
        
           | bin_bash wrote:
           | I had the same experience.
           | 
           | To be clear since I think it might not be obvious: lapser is
           | talking about asdf-direnv, not direnv by itself. See
           | https://github.com/asdf-community/asdf-direnv
        
         | tomatowurst wrote:
         | wow, this needs to be top comment. This is a no go for me.
         | since I use only pyenv and nvm, not too big of a problem.
        
           | lapser wrote:
           | I mentioned in my other comment that the direnv plugin aims
           | to resolve this. Personally I didn't get it working but I
           | haven't been determined enough. It has been working for
           | others.
        
       | vbrandl wrote:
       | If you are looking for a language agnostic version manager, the
       | nix package manager [0] might be worth a try. In combination with
       | lorri [1] you will be dropped into a shell with all required
       | development dependencies available, when you enter the project
       | directory. This does not only include the interpreter/compiler
       | versions but also any other dependency you can think of, like
       | specific libraries the project links against (well almost any, it
       | has to be available as a nix expression, best case directly in
       | upstream nixpkgs).
       | 
       | For me, it has come so far that I don't have any interpreters or
       | compilers in my main OS environment and even for one off REPL
       | sessions, I'll use `nix shell nixpkgs#python3 -c python3`.
       | 
       | [0]: https://nixos.org/
       | 
       | [1]: https://github.com/nix-community/lorri/
        
         | giancarlostoro wrote:
         | I mean to try it but some of these version managers work on
         | Windows too, I believe Nix is specific to Linux. Lorri sounds
         | amazing though! It's the kind of thing that made me fall in
         | love with solutions such as virtualenv (which handles the "this
         | directory needs these specific packages" installed locally, not
         | globally problem that Debian gives you).
        
           | baryphonic wrote:
           | I believe Nix works on top of WSL. And IIRC, it can even
           | handle building Windows GUI exe's, though that may be
           | mistaken.
        
           | vbrandl wrote:
           | One thing that differentiates nix from things like virtualenv
           | is that each (package + version) tuple exists at most once in
           | your local nix store and is then linked into your project
           | environments, while virtualenv will install new copies of the
           | packages. On the other hand you have to run the nix garbage
           | collector to get rid of unused packages.
           | 
           | As for Windows support: It seems to be possible to use nix in
           | WSL [0] but I've never tried that. I have used nix alongside
           | apt and pacman on Ubuntu/Arch before I decided to go all the
           | way and install the NixOS distribution. Using it alongside
           | other package managers worked really well.
           | 
           | [0]: https://nixos.org/download.html#nix-install-windows
        
             | mauflows wrote:
             | I've been running nix on wsl and works really well
        
           | chriswarbo wrote:
           | > I believe Nix is specific to Linux
           | 
           | I've used Nix on Linux (i686, x86_64 and ARM), macOS and
           | Windows (WSL2). I believe it also works (although not
           | officially supported) on BSDs, etc. too, although I've not
           | tried that yet.
           | 
           | > Lorri sounds amazing though! ...which handles the "this
           | directory needs these specific packages" installed locally,
           | not globally problem that Debian gives you).
           | 
           | You're describing Nix, not Lorri. Specifically:
           | 
           | - nix-shell provides a directory-local environments (and
           | more, e.g. #!nix-shell to fetch script dependencies
           | automatically)
           | 
           | - direnv can enter/exit this nix-shell environment when cd-
           | ing in/out of a directory
           | 
           | - lorri makes direnv+nix-shell faster, by building the
           | environment asynchronously in the background (rather than
           | causing our terminal to freeze)
        
         | Aleksdev wrote:
         | Looks cool! However it appears to have a bit of a learning
         | curve to get up and running.
         | 
         | Are there any other advantages to using nix?
        
           | vbrandl wrote:
           | In the end you could use nix to build docker/VM images and
           | use the same, reproducible environment in
           | prod/test/CI/dev/...
        
           | rsanheim wrote:
           | Yes! You can swoop into any thread discussing other packaging
           | / build tools, and recommend nix, immediately sidelining any
           | conversation about the original topic.
        
         | nvarsj wrote:
         | shell.nix + nix install is _the_ killer linux dev tool imo. It
         | replaces all the various nonsense with a hermetic, fully
         | reproducible build environment. You can then use the same
         | shell.nix in your CI with the nix docker image. Now you have
         | exactly identical dev environments across CI and locally. It's
         | awesome once you've experienced it.
         | 
         | The biggest drawback is installing Nix on OS X is a huge pain.
         | Docker has lots of magical UX tooling to make it rather
         | seamless in comparison.
        
           | ris wrote:
           | > The biggest drawback is installing Nix on OS X is a huge
           | pain
           | 
           | Did it on an aarch64 mac the other day. One command (two?),
           | 15 minutes, done.
        
           | mixedCase wrote:
           | Installing NixOS on modern macOS nowadays is super trivial.
           | Copy+paste command from website, follow instructions,
           | optionally enable flakes in a config file. That's it.
        
         | gmmeyer wrote:
         | I've used Nix. It solves an interesting problem. It is so
         | complicated as to be unusable by someone who is just looking
         | for a quick and simple solution to something like a virtual
         | environment
         | 
         | There's a reason why, despite being almost 20 years old, Nix
         | has at best a small cult following. It just doesn't solve the
         | problems that most people are looking to solve, most other
         | solutions are simply easier and in many ways better
        
           | Fnoord wrote:
           | Its not even 15 years old.
        
             | 3836293648 wrote:
             | 2022 - 2006 = 16
        
         | kristjansson wrote:
         | Here's a use case I pose every time Nix comes up in these
         | discussions.
         | 
         | For $REASONS I want python 3.7.10, and the full scientific
         | stack (numpy, scipy, pandas, numba, matplotlib, ...) at the
         | latest compatible versions along with pytorch. I don't mind
         | waiting for things to compile. How, if at all, can Nix help me
         | get into an environment that meets those constraints? Can it
         | help without requiring me to find and copy hashes of things?
        
           | zeec123 wrote:
           | https://github.com/nix-community/poetry2nix
        
           | ris wrote:
           | > requiring me to find and copy hashes of things
           | 
           | Put an incorrect hash in. Run the build. The error will tell
           | you what hash it actually got. Copy that. Run build again.
        
           | amelius wrote:
           | This is how I use Conda, which uses libsolv under the hood to
           | figure out compatible versions.
           | 
           | This makes me wonder: does Nix use libsolv, or a similar
           | idea?
        
         | viraptor wrote:
         | One place where asdf wins in convenience is when you actually
         | really care about versions though. It allows you to install
         | both new and old specific versions. In nix, while you can
         | achieve that, you'll be guided to use the currently supported
         | major versions like python 3.8, 3.9. Making sure you build with
         | exactly 3.7.1 as well as a module which was merged to nixpkgs
         | later is a serious pita.
        
           | mixedCase wrote:
           | It should not be. You're able to easily pin multiple specific
           | nixpkg versions in a flake.
        
             | viraptor wrote:
             | And you can do that in theory, but in practice it ends up
             | like this:
             | 
             | - you want to use lang-x.y.z, so you'll just reference an
             | old commit
             | 
             | - turns out that version was never packaged, so you copy
             | x.y.z-1 to your flake/overlay
             | 
             | - you end up patching the build because it doesn't work by
             | default with new environments
             | 
             | - on the other hand a module you're using needs the new
             | environment so you do your best to make everything happy -
             | more overlaying
             | 
             | - because you changed something crucial in a few steps,
             | you're compiling llvm 20 times through this process and now
             | it's 1am
             | 
             | Compare that to putting "rust 1.59" in your .tool-version
             | and running "asdf install". Guess who tried to use 3
             | specific versions of rust at the same time recently and got
             | very familiar with the process...
             | 
             | (That's also ignoring the issue like Ruby being packaged
             | without the platform identifier in nix which makes it
             | unusable for some development purposes)
        
               | speed_spread wrote:
               | Yup, the versions of the toolchain components required
               | for a project to build should be specifiable at the
               | project in an format actionable by the main build tool.
               | Running a project should never require more than "git
               | clone $project && $build-cmd".
               | 
               | It should never be Nix's business (or any other OS) to
               | provide elements of a project's toolchain. Reciprocally,
               | projects should go out of their way to not depend on OS
               | installed toolchain components.
        
               | mixedCase wrote:
               | > It should never be Nix's business (or any other OS) to
               | provide elements of a project's toolchain.
               | 
               | Why? I used to think the same way, but that's because of
               | the scar tissue of all the tooling being terrible at
               | accepting that build concerns and packaging concerns are
               | one and the same.
               | 
               | Nix proves it and makes this ancient pain a non-issue:
               | "My package depends on x, y and z, additionally, building
               | it requires a, b, and c, please also make build
               | dependencies available in my shell while I write code
               | too". That's it.
               | 
               | > Running a project should never require more than "git
               | clone $project && $build-cmd".
               | 
               | That's precisely what Nix allows you to achieve.
               | Meanwhile doing this:
               | 
               | > Reciprocally, projects should go out of their way to
               | not depend on OS installed toolchain components.
               | 
               | Means that you can never depend on anything you're not
               | vendoring (read: maintaining a copy of, on your own). Or
               | it means sacrificing productivity in the altar of shitty
               | tools. Nix allows you to have your cake and eat it too.
        
               | speed_spread wrote:
               | Shared projects should not depend on a particular package
               | manager. You may use Nix, but the next person might use
               | something else because reasons. If you bind a project's
               | lifecycle to a specific OS you'll be trading your
               | convenience for those of others.
        
               | viraptor wrote:
               | I think you're missing the point of nix. Unlike other
               | systems, yes you can make it mix's business to provide
               | that. And the threshold for "OS installed" becomes blurry
               | enough that projects can include the definition of what
               | they depend on from the system.
        
               | speed_spread wrote:
               | You're missing my point, that building a public project
               | from source should not require you to have a specific
               | package manager installed.
        
               | mixedCase wrote:
               | If it's Rust, you can use
               | https://github.com/oxalica/rust-overlay to get any
               | version you want very easily without pinning an instance
               | of nixpkgs just for it.
               | 
               | asdf does not allow you to keep three different versions
               | of the same language, so I'm not sure how that compares?
               | It's not super-trivial to do in Nix, but at least you can
               | do it.
               | 
               | asdf is also no different than Nix when it comes to
               | minor/major versions. You're at the mercy of what the
               | plugin does, other than that you have to create your own
               | plugin from scratch or make a fork. Nix has the option to
               | patch things up more easily at least.
        
               | viraptor wrote:
               | > asdf does not allow you to keep three different
               | versions of the same language
               | 
               | Sure it does. You can have any number installed and
               | either switch by changing the tools version file, setting
               | it for your shell, or referencing the right path
               | directly.
               | 
               | > You're at the mercy of what the plugin does
               | 
               | Again theory vs practice. In theory, sure, it depends on
               | the plugin. In practice, almost every plugin lists every
               | single released version to choose from. Which is much
               | different from nix where the official choices are limited
               | and you have to work to enable the rest.
        
               | mixedCase wrote:
               | > You can have any number installed and either switch by
               | changing the tools version file
               | 
               | Oh, that's cheating :) Nix can do the same thing!
               | Derivations are just kept in the store until you garbage
               | collect them. You can also configure multiple versions
               | _at the same time_ to present you with multiple binaries,
               | which is what I was referring to.
               | 
               | > Again theory vs practice. In theory, sure, it depends
               | on the plugin. In practice, almost every plugin lists
               | every single released version to choose from. Which is
               | much different from nix where the official choices are
               | limited and you have to work to enable the rest.
               | 
               | In practice, nixpkgs supports every maintained version of
               | most tools. Certainly far more tools than asdf can ever
               | hope to maintain. If not, there's an overlay or flake out
               | there to support it. Can you come out with specific
               | examples and a usecase?
        
         | acatton wrote:
         | My issue with Nix is thatm like docker, it is a dumb CLI which
         | communicate with a powerful daemon running as root.
         | 
         | I don't understand the concept/motivation behind it, everything
         | that nix does should be able to be done in userland, like
         | podman does, which I love.
        
           | hamandcheese wrote:
           | Because the nix store is global per system, it would be
           | unsafe to allow any user to write to the nix store in a
           | multi-user system. So the daemon instead mediates writes to
           | the store.
           | 
           | I'm not sure if there are other reasons.
        
           | viraptor wrote:
           | You can run nix without any daemon.
           | https://nixos.org/manual/nix/stable/installation/single-
           | user... It's not a requirement apart from multi-user
           | environments.
        
             | georgyo wrote:
             | Indeed!
             | 
             | The daemon is not powerful at all, almost all the logic
             | happens in the client.
             | 
             | The client does the parsing, job ordering, and tells the
             | daemon exactly what to do.
             | 
             | The daemon, only required in multiuser environments, does
             | only two things really.
             | 
             | - ensure that the /nix/store is protected as the daemon
             | should be the only process able to _write_ to it.
             | Everything can read from the nix store; no nix required at
             | all.
             | 
             | - execute build commands in a sandbox. Providing isolation
             | between multiple builds.
        
           | burke wrote:
           | The daemon is actually very dumb. It's just there to keep
           | /nix/store permissions clean.
        
         | qudat wrote:
         | Based on other comments like this, I gave it a try.
         | 
         | Be prepared to sink dozens and dozens of hours learning the
         | language, it's features, and switching everything over. Be
         | prepared to get stuck when you are required to use an old
         | version of a language and things don't install correctly -- and
         | sometimes blocked by nix itself from installing it. Be prepared
         | to get stuck if you are not in the happy path. Be prepared to
         | get lost in the sometimes scant documentation.
         | 
         | I love the idea of nix, but it did not work for me except for
         | the simplest cases.
        
           | packetlost wrote:
           | Not as bad as the guix crowd IMO. They're like the nix/Rust
           | "just use XYZ" crowd but also combined with the GNU zealots
           | so you get the perfect overlap of annoying software purists.
           | 
           | Really, I like the idea and I actually like the fact that
           | they use Guile (scheme) instead of a home-built DSL, but guix
           | is a horrible, poorly documented, doesn't work even on the
           | happy path mess.
        
             | sph wrote:
             | I honestly never heard anyone on HN recommending Guix over
             | Nix.
        
               | packetlost wrote:
               | I'm explicitly _not_ recommending it. I _want_ to like
               | it, but it doesn 't give me any reason to
        
             | b1n wrote:
             | New GUIX user here. I've found the documentation to be good
             | and the "zealots" seem very friendly - maybe take another
             | look.
        
             | robertlagrant wrote:
             | Never heard of guix til now. An annoying piece of software
             | with a cult-like following does sound up my street, though.
        
           | soraminazuki wrote:
           | I have the exact opposite experience. Nix is the best
           | solution out there _especially_ in the sort of situations
           | that you describe.
           | 
           | Nix provides a level of flexibility that other solutions
           | simply do not offer. If a package in Nix doesn't fit your
           | requirements for whatever reasons, you can create a modified
           | version of a package with ease. For example, say that you
           | need a version of Nginx built against a custom version of
           | OpenSSL. You can do just that with a few lines of code:
           | let           mypatch = pkgs.fetchpatch {             url =
           | "https://example.com/bugfix-for-openssl.patch";
           | sha256 = "...";           };                openssl =
           | pkgs.openssl.overrideAttrs (old: {             # add build
           | flags             configureFlags = old.configureFlags ++ [ "
           | --enable-foo" ];                  # add dependencies
           | buildInputs = old.buildInputs ++ [ pkgs.foo ];
           | # add patches             patches = old.patches ++ [ mypatch
           | ];           });         in         nginx.override { inherit
           | openssl; }
           | 
           | Nix will even know which packages it'd need to build locally
           | instead of downloading a prebuilt binary.
           | 
           | You can't do that with other common package managers. You're
           | stuck with whatever the package manager provides you. So if
           | you're not in the happy path, you're out of luck. You'd
           | either have to give up or build from scratch. If you need a
           | bugfix for a particular package, you'd have wait until the
           | fix reaches the package repository. When I was using Ubuntu,
           | that was often until the next major release. None of this
           | stuff is a problem with Nix, which allows for customization
           | with very little effort.
           | 
           | It's easy to learn about Nix if you know where to look for.
           | Nix Pills [1] would be a good start. The core language is the
           | easiest part. It's JSON, but with functions and variables for
           | proper abstraction. The documentation, while imperfect, is
           | quite extensive compared to a majority of other high profile
           | open source projects. If the documentation fails you, the
           | Nixpkgs repository [2] is an even more rich source of
           | information. The code is well organized, and I was able to
           | get familiar with writing Nix packages fairly quickly by
           | grepping the codebase. And finally, Nix has a sizable
           | community so you could always ask if you're stuck.
           | 
           | [1]: https://nixos.org/guides/nix-pills/
           | 
           | [2]: https://github.com/NixOS/nixpkgs
        
             | xrd wrote:
             | This is the best comment I've read on nix yet!
             | 
             | I've been using nix as my daily OS for six months and I'm
             | able to be productive. At the same time, I'm often confused
             | as to whether I should use nix-shell, nix-env or modify my
             | configuration files.
             | 
             | Thanks for the great comment.
        
               | SkyMarshal wrote:
               | I'm new to NixOS too. My general rule is to try to keep
               | my core system build/description as minimal as possible.
               | Default to nix-shell first, and only if I'm using that
               | thing repeatedly do I then test-install it with nix-env,
               | and if that succeeds then add it to configuration.nix.
        
             | qudat wrote:
             | Your example looks great! Indeed I trolled every piece of
             | nix documentation I could find -- it was the only way to
             | figure out what I should be doing.
             | 
             | Here's the simplest example of an utter failure when I
             | tried nix: installing ruby 2.2. It's very possible I did
             | something totally wrong, but when I _have_ to use ruby 2.2
             | and nix cannot do it, it sort of kills your awesome example
             | of being able to override openssl.
             | 
             | Another extremely frustrating experience was the
             | bifurcation between nix and nixos. Clearly one experience
             | is preferred over the other. So many blogs and docs talk
             | about things like HomeManager and other configurations that
             | are nixos specific.
             | 
             | On top of nixos/nix, there's also shell.nix/flakes. There's
             | just too much development in nix right now to make sense of
             | what's going on.
        
               | SkyMarshal wrote:
               | Did you ever try using Ruby 2.2 in an isolated nix-shell?
               | That's arguably the best feature of nix-shell, to create
               | an isolated environment with only the packages you need
               | for that particular project.
        
               | Kaze404 wrote:
               | You don't need NixOS for Home Manager. It's actually the
               | first chapter in the installation section: https://nix-
               | community.github.io/home-manager/index.html#sec-...
        
               | soraminazuki wrote:
               | > when I have to use ruby 2.2 and nix cannot do it
               | 
               | Considering that ruby 2.2 was released in 2014, I can't
               | say I'm surprised. It's too much effort to continue
               | maintaining something so old. But if you really want to
               | use it, you could try using the package definition from
               | an older commit of Nixpkgs:                   let
               | nixpkgs1709 = pkgs.fetchFromGitHub {             owner =
               | "NixOS";             repo = "nixpkgs";             rev =
               | "e09c0adc63d10249dac8f90313f91e1050861d3c";
               | sha256 =
               | "sha256-Di9D0gvaESV3JmX/kW2uEJ68QDlAke23t19bImTXsJ8=";
               | };                    pinnedPkgs = import nixpkgs1709 {
               | };         in         pinnedPkgs.ruby_2_2
               | 
               | > Another extremely frustrating experience was the
               | bifurcation between nix and nixos.
               | 
               | I'm not sure what you mean. Nix is the package manager
               | while NixOS is an entire distro based on Nix the package
               | manager and its configuration language. They have clear
               | separation of concerns. Keeping it that way has actual
               | benefits too, namely portability. It allows you to use
               | Nix on a wide range of platforms including non-NixOS
               | Linux distros, macOS, and even BSDs to some extent.
               | 
               | > On top of nixos/nix, there's also shell.nix/flakes.
               | 
               | Flakes are currently an experimental feature and not
               | meant for wide use yet. So if you're just getting started
               | with Nix, I'd recommend looking into it later until
               | you're sufficiently comfortable with Nix.
               | 
               | They're not fundamentally different, though. Flakes
               | formalize the conventions for writing Nix expressions to
               | make them more reusable.
        
               | mikepurvis wrote:
               | Flakes are actually part of the piece for how to sanely
               | get access to old versions of things, as your project
               | flake can bring in multiple instances of nixpkgs from
               | different "stable" branches and then pull the specific
               | packages off each one that you need.
        
             | darkwater wrote:
             | > It's easy to learn about Nix if you know where to look
             | for.
             | 
             | I understand you are saying it with the best intentions but
             | it might sound like not the most correct way of defending a
             | tool being criticized for its lack of documentation or easy
             | of use.
        
               | soraminazuki wrote:
               | I feel that the criticism regarding documentation is too
               | harsh. Speaking from experience, Nix has more
               | documentation and community resources than most open
               | source projects that I've encountered.
        
               | jahewson wrote:
               | Most open source projects have a woeful lack of community
               | resources and documentation though, so that's not really
               | saying much.
               | 
               | Ultimately documentation doesn't solve usability problems
               | it just makes note of them.
        
             | bastardoperator wrote:
             | What problem is this solving that a shell script couldn't
             | handle for you? I don't know anything about nix, genuinely
             | curious.
        
               | SkyMarshal wrote:
               | The example above is part of a declarative, reproducible,
               | full system build. You include it in your build
               | description file, and then Nix will rebuild the entire
               | system in the exact same way across multiple machines.
               | 
               | That's less of a guarantee with a collection of shell
               | scripts.
        
               | soraminazuki wrote:
               | With a shell script, you get to enjoy all the pains of
               | building software _and_ its dependencies from scratch.
               | Even then, you wouldn 't be even halfway done. You'd also
               | need to go through the process of turning your ad-hoc
               | procedures into a reproducible script only to find out
               | that it broke months later.
               | 
               | Nix provides better abstractions and composability to
               | make that experience far less painful. Note that in my
               | previous example, I didn't need to specify how to build
               | OpenSSL or Nginx. I was able to reuse the definition from
               | Nixpkgs and apply my own customizations to it.
        
             | X6S1x6Okd1st wrote:
             | It is both great and terrible, a shining example for me was
             | that I wanted to install a package built off a specific
             | commit. That was trivial, I just over rode the source and
             | the expected hash and the exact same build & install steps
             | worked.
             | 
             | Also rollbacks in nixos are amazing.
             | 
             | On the other hand newly packaging something can be really
             | daunting.
        
           | flurie wrote:
           | I think an easy trap with nix is the immediate desire to have
           | it manage everything, which usually involves installing
           | NixOS. It's the equivalent of being airdropped into the
           | Romanian countryside with working knowledge of French. I am
           | trying to adapt nix for use with some teams I'm consulting
           | on, and my goal is to make its usage as dead simple as
           | possible for really high value tasks.
           | 
           | I also feel like nix is immediately tangible and beneficial
           | in a way that makes us want to get to the power user level,
           | but I don't feel like wanting to learn, say, kubernetes means
           | one automatically wants to learn to be a cluster operator.
           | The scope and complexity are great, and I have experienced
           | all of the things you have described as well. Now that I am
           | fairly confident in my abilities, I think it's important to
           | make sure we find ways to help everyone get the most out of
           | it, even if it doesn't involve scaling the wall that is the
           | learning curve.
        
             | xpe wrote:
             | > I think an easy trap with nix is the immediate desire to
             | have it manage everything, which usually involves
             | installing NixOS.
             | 
             | Can you clarity what you mean?
             | 
             | What do you mean by "trap"? Which (if any) of the following
             | concepts factor into your understanding? Broken
             | expectations? Premature optimization? Over-engineering?
             | Lock-in?
             | 
             | Are you suggesting that many users of the Nix package
             | manager "fall into a trap" and begin using NixOS?
             | 
             | What do surveys and/or data show about usage of just the
             | Nix package manager? Combined with NixOS?
        
               | flurie wrote:
               | Absolutely, and if it was not clear from the context, I
               | call it a trap because that feels like what I'd fallen
               | into at some point. Let me see if I can describe it
               | better.
               | 
               | The Nix ecosystem is attractive to me at a high level
               | because it looks like it has the possibility to
               | revolutionize a lot of the problems that come up with an
               | increased focus on devops culture. The problem with the
               | Nix ecosystem itself is that it is larger and more varied
               | than it might appear.
               | 
               | There are really three large entities in the ecosystem:
               | nix the language, nix the package manager (nixpkgs), and
               | nix the OS (NixOS). Despite the fact that there is a lot
               | of overlap in some of the details of these three things,
               | they are easily understood as separate entities. There
               | are a bunch of smaller secondary entities such as nix-
               | darwin, home-manager, devshell, and digga (formerly
               | devos). The aim of these entities is usually to
               | supplement, enhance, replace, or reproduce features of
               | nixpkgs and/or NixOS.
               | 
               | Each of these entities has its own learning curve. It
               | takes surprisingly little nix knowledge to use it as a
               | dev environment generator, but nixpkgs knowledge will
               | help a bit more. Even within nixpkgs itself, each major
               | language has a large ecosystem built up around
               | facilitating package building and deployment, and these
               | are extremely heterogeneous. Some of them require that
               | you regenerate the entire matrix of package dependencies
               | for the package manager (javascript, haskell). Some of
               | them have tooling that allow you to get started with
               | almost no effort (mach-nix for python). These all have
               | their own peculiarities. NixOS has a ton of modules, all
               | rather heterogeneous, on top of requiring more careful
               | knowledge of how to put together a system than most other
               | distros. And nix the language without nixpkgs is _very_
               | small, and some of what it does have built in is
               | necessary so it can bootstrap an actual stdlib from
               | nixpkgs.
               | 
               | The trap is sprung once you've been sold on the idea, and
               | even seen it shine through some things, but feel like you
               | have an entire wall to climb to get to a point of general
               | competency. All of these things I've described, and even
               | some of their subgroups, require new knowledge for a more
               | complete understanding. I do not understand the details
               | of many of the things I have described, and I would
               | consider myself a power user at this point. What looks
               | like one gigantic, insurmountable cliff is really dozens
               | of much smaller cliffs, many of which are not necessary,
               | at least not to most people.
               | 
               | At one point I wanted to test my skills in a really
               | generic way, so I helped fix broken packages on macOS
               | during one of the two yearly regression periods where the
               | community tries to get the CI builds passing. I picked
               | the packages completely at random. Most of what I ended
               | up fixing was C/C++ based, and I don't normally work in
               | it, or I haven't for many years, but I feel like I
               | learned a good bit about cmake. I don't really write
               | Haskell, but I was able to fix a bug in a solving library
               | having to do with a missing portability shim. I didn't
               | have help for any of this, and in some cases I was either
               | too stuck to fix the build or unable to fix it due to
               | problems beyond my control.
               | 
               | All of this is to say that I think getting to this point
               | is a lot less painful if one takes a use case, preferably
               | a narrow one, and focuses on learning whatever is
               | necessary in the service of that use case. Some good
               | topics are dev environments, using nix as an app/project
               | builder, using nix to build containers, using nix to
               | manage remote machines (the difference between these and
               | personal machines is that the scope of these machines
               | tends to be much smaller). I think people try to take on
               | too many of these things simultaneously and end up
               | overwhelmed. That's not to say that NixOS isn't worth
               | learning, but I think many people could realize most or
               | all of the real-world benefit if they use nix on an OS
               | they're comfortable with. Coming back to my comparison of
               | being dropped in the Romanian countryside, if you want to
               | learn Romanian, start there. If you want to experience
               | the countryside, maybe a guided tour is the way to go. If
               | you want to learn about the life of Ligeti, you might not
               | even need to learn Romanian! But total immersion is
               | difficult and draining, and a failed immersion experience
               | doesn't mean Romania is a bad place. So it is with Nix.
        
               | lloeki wrote:
               | Many use cases can be covered just by simple uses of
               | nixpkgs, but it's often alluring to go beyond that. e.g
               | 
               | package manager (whether on Darwin or any linux distro),
               | to have some tools globally available:
               | nix-env -iA nixpkgs.${some-package}
               | 
               | per project, most shell.nix can just look like this:
               | {           pkgs ? import <nixpkgs> {},         }:
               | let           some_var = some_value;         in
               | pkgs.mkShell {           buildInputs = [
               | pkgs.some_package             ...           ];
               | shellHook = ''             # this is bash, so, whatever
               | floats your boat           '''
               | 
               | e.g asdf, only much more generic with full non-leaking
               | package management:                   {           pkgs ?
               | import <nixpkgs> {},         }:         let
               | some_package = pkgs.some_package_1_2;         in
               | pkgs.mkShell {           buildInputs = [
               | some_package             pkgs.some_other_package
               | ...           ];                    shellHook = ''
               | export SOME_VAR="some_value"             ...
               | '';         }
               | 
               | ruby/rvm/rbenv/bundle exec (example for rails >= 6):
               | {           pkgs ? import <nixpkgs> {},         }:
               | let           ruby = pkgs.ruby_2_7;           python =
               | pkgs.python27;           node = pkgs.nodejs-14_x;
               | in pkgs.mkShell {           buildInputs = [
               | ruby             pkgs.sqlite             python
               | node             pkgs.nodePackages.yarn           ];
               | shellHook = ''             export RUBY_VERSION="$(ruby -e
               | 'puts RUBY_VERSION.gsub(/\d+$/, "0")')"
               | export GEM_HOME="$(pwd)/vendor/bundle/ruby/$RUBY_VERSION"
               | export BUNDLE_PATH="$(pwd)/vendor/bundle"
               | export PATH="$GEM_HOME/bin:$PATH"           '';         }
               | 
               | python/pyenv/venv:                   {           pkgs ?
               | import <nixpkgs> {},         }:         let
               | python_packages = python-packages: [             python-
               | packages.pip           ];           python =
               | pkgs.python38.withPackages python_packages;         in
               | pkgs.mkShell {           buildInputs = [
               | python           ];                    shellHook = ''
               | export PYTHON_VERSION="$(python -c 'import platform;
               | import re; print(re.sub(r"\.\d+$", "",
               | platform.python_version()))')"             export
               | PIP_PREFIX="$PWD/vendor/python/$PYTHON_VERSION/packages"
               | export
               | PYTHONPATH="$PIP_PREFIX/lib/python$PYTHON_VERSION/site-
               | packages:$PYTHONPATH"             unset SOURCE_DATE_EPOCH
               | export PATH="$PIP_PREFIX/bin:$PATH"           '';
               | }
               | 
               | mixing arm64 and x86_64 on an Apple Silicon machine:
               | {           x86_64 ? import <nixpkgs> { localSystem =
               | "aarch64-darwin"; },           aarch64 ? import <nixpkgs>
               | { localSystem = "x86_64-darwin"; }         }:         let
               | foo = aarch64.foo;         in aarch64.mkShell { # this
               | makes nix-shell drop to an arm64 shell, change it to
               | x86_64 to be intel/Rosetta2           buildInputs = [
               | foo             x86_64.bar             aarch64.baz
               | ];         }
               | 
               | using an unstable/pinned/git package:                   {
               | stable ? import <nixpkgs> {},           unstable ? import
               | (fetchTarball http://nixos.org/channels/nixos-
               | unstable/nixexprs.tar.xz) {},           pinned ? import
               | (fetchTarball https://github.com/nixos/nixpkgs/archive/ca
               | 2ba44cab47767c8127d1c8633e2b581644eb8f.tar.gz) {},
               | git ? import (fetchGit { url =
               | "https://github.com/nixos/nixpkgs/"; ref =
               | "refs/heads/nixos-unstable"; rev =
               | "ca2ba44cab47767c8127d1c8633e2b581644eb8f"; }) {},
               | }:         let           foo = stable.foo;         in
               | stable.mkShell {           buildInputs = [
               | foo             unstable.bar             pinned.baz
               | git.qux           ];         }
               | 
               | selecting a particular C/C++ compiler&stdlibc++ version:
               | {           pkgs ? import <nixpkgs> {},         }:
               | let            clang = pkgs.clang_12         in
               | pkgs.llvmPackages_12.stdenv.mkDerivation {
               | buildInputs = [             clang           ];         }
               | 
               | The trap is: You could handle all of that by using or
               | writing nix features. You could even use NixOS instead of
               | whatever distro you're used to. But then by going cold-
               | turkey you have to learn whatever nix feature on top of
               | all the basic (as in fundamental) things nix has to
               | offer. Purists would say "no no no this is not the
               | sanctioned way", which is kind of true but also setting
               | yourself up for failure; it'd be like looking at a
               | mountain and trying to jump right to the top, which of
               | course you will fail to, when you could just be climbing
               | it and be successful. Whatever practical gets you on
               | board is fine. You can get to the "pure nix" stuff later,
               | if you ever need to.
        
             | robertlagrant wrote:
             | > the equivalent of being airdropped into the Romanian
             | countryside with working knowledge of French
             | 
             | Thanks to a chatty Romanian taxi driver I had earlier
             | today, I understand this.
        
           | tmpz22 wrote:
           | Don't threaten Linux users with a good time.
        
           | randomblock1 wrote:
           | Same, nix seems like such a perfect solution- but it's
           | prohibitively hard. Sure, I could use it and sink 12 hours
           | into reading the documentation, or I could just install
           | pyenv/nvm/etc and be done in 1 minute.
           | 
           | Look at Python with Nix: https://nixos.wiki/wiki/Python And
           | then consider the simplicity of `pyenv install x.x.x` and a
           | requirements.txt.
        
           | tra3 wrote:
           | Do you think it's worth it to sink the hours up front for
           | future efficiency gains?
        
             | lelanthran wrote:
             | > Do you think it's worth it to sink the hours up front for
             | future efficiency gains?
             | 
             | " _possible_ future efficiency gains ".
        
               | xpe wrote:
               | Many things in the world are _possible_. I often find
               | _probable_ to be a more useful concept than _possible_.
               | Any tool with deterministic results (such as Nix) are
               | highly likely to reduce a whole class of future problems.
               | 
               | With this in mind, the question shifts from rather vague
               | talk about _possible_ futures to various kinds of
               | scenarios.
               | 
               | What happens when software developers have a
               | deterministic build system? On the whole, the benefits
               | are significant. Sure, there are costs to get there. In
               | my view, the benefits often outweigh the costs.
        
               | lelanthran wrote:
               | > Many things in the world are possible. I often find
               | probable to be a more useful concept than possible. Any
               | tool with deterministic results (such as Nix) are highly
               | likely to reduce a whole class of future problems.
               | 
               | I disagree with the whole "highly likely" bit. Just
               | because something new has a large positive value, that
               | does not mean that a large time-investment or effort-
               | investment in it is likely to pay off.
               | 
               | After all, it may never get traction to make the cost of
               | learning it worthwhile - some other, newer, better,
               | easier system could come along and be adopted instead.
               | 
               | We've seen this play out again and again in the
               | technology world[1]. In 2000, a large time and effort
               | investment into UTF-16 would be wasted as the world
               | adopted UTF-8 instead. A large time and effort invested
               | into new languages with powerful features (Haskell, circa
               | 2005) would be wasted as the industry largely ignored it
               | in favour of (presumably) inferior alternatives.
               | 
               | Is nix highly likely to provide solutions to a whole
               | class of problems?
               | 
               | Sure.
               | 
               | Is it highly likely to be the dominant, or even a common
               | tool, in the future that solves those problems?
               | 
               | Doubtful; "easier-to-use" has always won against "can
               | better solve problems". I see no evidence that this will
               | change anytime soon.
               | 
               | [1] I've found that by procrastinating about learning a
               | new technology, I can sometimes manage to avoid having to
               | learn it altogether, because the tech dies off before my
               | procrastination does. By putting off learning VRML in
               | 2001, it went away before I ever got to it.
               | 
               | Likewise, I'll put off learning new things until I
               | actually have a need for the solution they offer. At
               | least then, even if they die out in a few years, I'd have
               | at least solved my immediate problems.
        
               | tra3 wrote:
               | Thanks for your thoughts. I worded my question poorly, I
               | suppose, but you got my meaning.
               | 
               | I keep seeing nix mentioned alongside complaints about
               | it's maturity but that seems par for the course for
               | something new, doesn't it? Until a tool reaches critical
               | mass sharp edges are to be expected.
               | 
               | I'll look into nix again when I have an appropriate use
               | case.
        
             | xpe wrote:
             | Word choice observation: someone arguing in factor of
             | spending time up-front for future gains would probably say
             | "invest".
        
               | tra3 wrote:
               | Appreciate you pointing this out.
        
           | cr__ wrote:
           | What really stings is that I could have written this exact
           | comment in 2015, when I did the same thing.
        
           | samhh wrote:
           | I agree that the documentation story could be better. I also
           | think it's a great shame that the language isn't statically-
           | typed, so to understand how to use something I have to
           | inspect its source code.
           | 
           | I've found it to be quite flexible though. For example,
           | here's a commit in which I apply a patch to a tool to solve a
           | problem that the derivation hadn't taken into account (and
           | absent a home-manager solution): https://github.com/samhh/dot
           | files/commit/867dd3b4d4b3942a0aa...
        
             | omaranto wrote:
             | > I also think it's a great shame that the language isn't
             | statically-typed, so to understand how to use something I
             | have to inspect its source code.
             | 
             | I understand everything in that sentence except the word
             | "so".
        
               | samhh wrote:
               | Static types are documentative, and language servers
               | often also show you things like JSDoc alongside the type
               | signature. Nix has neither of these, hence I have to
               | check the source code or run a build and see what
               | happens.
               | 
               | I really like Nix but in this particular way it feels
               | like taking a big step backwards from the other languages
               | I frequently use, particularly for a language in which
               | you'll necessarily be constantly interacting with bespoke
               | interfaces.
        
               | omaranto wrote:
               | Informative function signatures, allowing programmers to
               | add per-function documentation, and tooling that displays
               | those things are by no means limited to staticly typed
               | languages.
               | 
               | I guess knowing allowed types for each parameter is
               | informative (more if very specific types are used rather
               | than string or integer), but documentation usually
               | specifies that anyway. And even knowing all the types
               | isn't usually enough without documentation.
               | 
               | My point is just that I've used plenty of libraries in
               | dynamically typed languages without needing to read the
               | source. And conversely, I've occasionally needed to look
               | at the source of a function in a staticly typed language,
               | to answer some question not answered by the types and
               | documentation.
        
               | SkyMarshal wrote:
               | Being able to see a function's entire type signature at a
               | glance is the single most useful way of documenting code
               | I've ever come across. No alt-tabbing to docs or relying
               | on an IDE to pop up hints, etc., it's just right there.
               | 
               | Haskell is the ideal here, since it separates the type
               | signature into its own separate line at the top of the
               | function declaration. That confers readability and
               | reduces cognitive overhead more than any other language
               | I've used.
               | 
               | It also changes the programming thought process. You can
               | pseudo-code an entire program just with function type
               | definitions. Then test that the type defs compile without
               | error, and go back and implement the function
               | definitions. As long as the function definitions adhere
               | to their type signature, the program almost always works
               | (barring some I/O errors).
               | 
               | Not all statically typed languages are created equal. The
               | ones fundamentally oriented around function type
               | signatures, rather than variable types, are the ones I
               | think parent had in mind in his comment.
        
           | knowmad wrote:
           | As someone who has been using asdf daily for over a year now
           | I can say from experience it's awesome and should absolutely
           | replace all individual language managers as the standard way
           | we manage language versions.
           | 
           | I recently gave nix a try because of a hacker news comment
           | and agree with most of the points in this comment. The fact
           | that new users are encouraged to read not 1, but 3 separate
           | manuals to grok the tool is extremely discouraging for new
           | users. Also the fact that nix is currently transitioning to a
           | new feature called flakes and deprecating channels signals to
           | me that the ecosystem is not stable enough for me to
           | recommend that my team at work use it right now.
           | 
           | That being said, I intend to read at least 2 of the manuals
           | and use nix for dependency management in my side projects and
           | to manage my system dependencies. I think nix takes all the
           | great things that asdf can do, to a whole new level. The
           | dream of having a nix section in my projects 'Getting
           | Started' that only has 2 steps (1. Install nix 2. Run `nix-
           | shell`) is something I desperately want.
           | 
           | I think nix is much like erlang in that it's incredibly
           | powerful and solves a lot of common problems, but it's used
           | and maintained by an old guard that went through the trouble
           | of learning how to use it and maintains the "I did it, why
           | can't you" mindset. The erlang ecosystem has been given new
           | life and been made easily available to new users thanks to
           | the awesome work done by Jose Valim and the rest of the
           | elixir team and community. However, I really hope that it
           | doesn't take 30 years and a new language built on top of nix
           | for it to become accessible to everyone.
           | 
           | For those working on nix and the new flake functionality
           | please look to things like elixir and asdf for inspiration on
           | documentation, ease of use and pragmatism. Help make the tool
           | you love ubiquitous. It will ultimately make your life easier
           | when working with new developers because they will already
           | have nix installed.
           | 
           | I intended to do everything I can to help push nix in this
           | direction (once I understand how the hell it works) if anyone
           | reading this, has some time on their hands and wants to
           | improve the state of software development for everyone please
           | go down the nix rabbit hole and try to find ways to
           | contribute to making it more accessible.
        
           | shantnutiwari wrote:
           | The Nix crowd is becoming a lot like the Rust crowd-- they
           | hijack every conversation with "Have you tried Nix"?
           | 
           | Like you, I find Nix hard to use and the docs confusing
           | (beyond trivial examples). The amount of time the Nix mafia
           | spends proselyting could be better spent making better docs
        
             | tannhaeuser wrote:
             | I agree. I've got nothing against nix, but it frankly sucks
             | that the top comment isn't about asdf which I had hoped to
             | learn about. There should be special "-1 offtopic" comment
             | flagging because it's a frequent phenomenon.
        
               | SkyMarshal wrote:
               | As a fan of Nix and NixOS, I agree with this assessment.
               | Too often people hijack threads about a topic to discuss
               | something related but totally different and off-topic.
               | It's kind of annoying, even when I'm a fan of the off-
               | topic thing.
               | 
               | I've never heard of asdf and popped in here to read about
               | it, people's experiences with it, etc. If I want to read
               | about Nix/OS I'll find a thread on that, or go to
               | /r/nixos, etc.
        
               | leaflets2 wrote:
               | > Too often people hijack threads about a topic to
               | discuss something related but totally different and off-
               | topic
               | 
               | And what are you doing :-)
        
               | ravi-delia wrote:
               | I mean, just minimize the comment? I like seeing
               | discussion on many related aspects of an article, it's
               | cool seeing how things compare.
        
               | ris wrote:
               | > the top comment isn't about asdf which I had hoped to
               | learn about
               | 
               | Oh I think you're using HN wrong. To learn about the
               | subject you can read the actual article that's linked to.
               | No guarantees about the comments section.
        
             | jjgreen wrote:
             | They do seem to share a fondness for executing curl output
        
               | caymanjim wrote:
               | This criticism is getting old. Piping curl output to bash
               | is no less secure than installing a package via any other
               | mechanism. Either you trust the source or you don't. I
               | trust it more than I trust npm or pip because I'm
               | typically getting it from the primary source instead of
               | relying on a middleman that's got a poor track record.
        
               | leaflets2 wrote:
               | If there's a SHA hash, served by a different server, an
               | attacker would have to compromise both -- now just one?
        
               | jjgreen wrote:
               | It may be old, but it is valid, and it allows me to mock
               | Rust and Nix advocates at the same time; who could
               | resist?
        
             | cwp wrote:
             | Yeah, frustration on both sides here. On one hand, I can
             | see how the nix evangelism can get annoying, especially
             | here on HN. On the other hand the nix crowd is seeing a
             | parade of ad hoc, informally-specified, niche
             | implementations of way-less-than-half of nixpkgs. This is
             | an important problem, maybe one of this most important
             | problems the tech world is grappling with right now, and
             | _there is already a solution_.
             | 
             | The reality is that the docs are fine. The reference
             | material is comprehensive, and there are some very good
             | tutorials and introductory essays to get people started.
             | The problem is that it's difficult. Nix is very, very
             | different from what people already know, and it takes quite
             | a bit of effort to learn how it works. Most people just
             | aren't prepared to do that much work just to install some
             | software.
        
               | airza wrote:
               | If the problem is that it's difficult and the
               | documentation is not making that difficulty simple enough
               | to use, then the documents are not fine. Simple as.
        
               | leaflets2 wrote:
               | If the problem is that it's difficult to learn to fly a
               | fighter jet, and the documentation is not making it
               | simple, the real problem is that the documentation is not
               | fine. Simple as that.
        
               | arrakeen wrote:
               | > The reality is that the docs are fine
               | 
               | then show me where `nix-env`'s `--arg` and `--argstr` is
               | documented.
        
               | w-j-w wrote:
               | The ad-hoc solutions you're talking about are often
               | highly usable, a virtue often forgotten by software
               | evangelists. Nix's learning curve will keep away people
               | who are disciplined in avoiding yak-shaving, as the
               | language specific version enables productivity now. Maybe
               | adding a layer on top of Nix, like create-react-app is to
               | webpack, can make it a better option for immediate
               | productivity oriented developers.
        
               | exdsq wrote:
               | Nope nope nope. They're not fine. Nix is really really
               | hard to use. I worked for a company that ran all the ops
               | with Nix managed by some of the contributors. Every time
               | I wanted to do something I'd have to get DevOps to do it
               | for me. I've never ever had that level of difficulty
               | doing stuff outside of a Nix environment and I really,
               | really tried. Most of my colleagues who are fairly decent
               | developers struggled with it too. It's the _only_ tech I
               | advise against when it 's mentioned nowadays. And I
               | _want_ to like it.
        
               | lambdaba wrote:
               | On the other hand only Nix (to my knowledge) guarantees
               | truly reproducible builds.
               | 
               | It helps that people who are into Nix most often use
               | NixOS. NixOS is the only distro I've written packages
               | for. It's not even particularly hard since there's a lot
               | of inspiration to find in the official and community
               | repos + people sharing personal configurations.
               | 
               | The UX wasn't the best but it's improving.
               | 
               | It remains extremely reliable which is not something that
               | you could say of other systems.
        
             | marcosdumay wrote:
             | Hum... Every time I see Nix cited somewhere, it's somebody
             | who tried it and didn't manage to get expertise out of the
             | documentation maze. (You can add me there too.)
             | 
             | But it's no wonder that people keep commenting that Nix is
             | an awesome idea that solves a lot of problems. That's
             | because it's an awesome idea that solves a lot of problems
             | (yeah, like Rust).
             | 
             | It is also completely undiscoverable (not completely unlike
             | Rust), and that's why almost nobody uses it. But that's a
             | matter of improving the documentation or maybe fixing one
             | or two superficial problems on the language.
        
               | oblio wrote:
               | > But that's a matter of improving the documentation or
               | maybe fixing one or two superficial problems on the
               | language.
               | 
               | Based on a quick check of their Wikipedia page, Nix has
               | been around for 15 years, since 2007.
               | 
               | So those for sure look like structural problems. I don't
               | know which ones exactly, but paraphrasing Tolstoi,
               | popular software products are popular in much the same
               | way, while unpopular ones are unpopular in their own
               | unique ways.
               | 
               | In my experience almost no open source project that
               | hasn't entered the mainstream in its first 10 years
               | manages to turn the ship around, unless it lucks into a
               | major change of environment. Programming languages are
               | sometimes exempt if they have a "killer" library or
               | framework pop up.
        
               | whateveracct wrote:
               | Nix ain't trying to win marketshare it's trying to be
               | amazing. But it takes guts to be amazing and that means a
               | lot of people don't manage to use Nix.
               | 
               | HN tends to see success in terms of adoption rate &
               | ranking. Nix is on another plane. It's beyond critical
               | mass. And for people like me, it is a huge force
               | multiplier. But I had to grind my way to the point where
               | that is true.
               | 
               | I tend to not bother selling people on it. People who
               | want what Nix does will find it at some point. So I just
               | focus on using Nix myself in a world of worse tools.
               | Feels great.
        
               | robertlagrant wrote:
               | Oh, I'm not selling these cars. No, no. These babies sell
               | _themselves_.
        
               | grumbel wrote:
               | Nix just got a huge overhaul, with most functionality
               | getting bundle under a single easy to use 'nix' command
               | (i.e. similar to 'apt'), rendering a lot of the old
               | commands obsolete. That currently creates a bit of a
               | confusing situation, as lots of docu is about old
               | commands, while new commands that look similar can behave
               | quite a bit different (e.g. 'nix-shell' != 'nix shell').
               | Nix Flakes are another new thing and also create a bit of
               | confusion and ugliness (e.g. packages being named
               | 'nixpkgs#legacyPackages.x86_64-linux...').
               | 
               | That said, I haven't found Nix hard to use, quite the
               | opposite. The new 'nix' command is pretty self
               | explanatory, it's just a little incomplete in spots. And
               | the Nix language is quite simple and easy to understand
               | if you have ever touched a functional language. Compared
               | to all the other Linux stuff I have played with over the
               | years, it was a very pleasant experience so far.
        
               | marcosdumay wrote:
               | Well, Nix is mainstream.
               | 
               | Evidence of that is that you can just talk about it by
               | name here on HN without explaining what it is.
        
               | samb1729 wrote:
               | That could just as easily be attributed to the word Nix
               | being easy to search for. But even if everyone on HN is
               | aware of what it is, that doesn't make it mainstream by
               | any definition I can think of. There are countless
               | examples in the world of things that most people (in a
               | given audience) are aware of, but that almost none of
               | them participate in.
               | 
               | Is Haskell mainstream? What about committing murder?
        
               | marcosdumay wrote:
               | Your claim is that software doesn't go from non-
               | mainstream into popular if it stays non-mainstream for a
               | decade. I'm really not willing to discuss the definition
               | of "mainstream", but there are plenty of cases of
               | software that stayed a decade as "everybody knows it,
               | nobody uses it" and eventually got popular.
        
               | 3836293648 wrote:
               | It is horrible searching for Nix stuff because of all the
               | *nix stuff.
               | 
               | And yes, this is 100% Nix's fault
        
         | AceJohnny2 wrote:
         | nix local package search sucks, and it is much more effective
         | to use the online package search [1].
         | 
         | It's astounding because the local version is doing a naive,
         | case-sensitive regex search, which is pretty bad when you're
         | looking for, say, the Perl package MIME::Lite which can have
         | various junctions and capitalizations. In fact, that package
         | has a listed name of perl5.34.0-MIME-Lite but is installable as
         | nixpkgs.perl534Packages.MIMELite!? I can't even.
         | 
         | I found the code a few months back (but can't be bothered to
         | look it up just for a comment). I didn't fix it then because I
         | had other priorities than learning how to modify my local copy
         | of nix to test it.
         | 
         | [1] https://search.nixos.org/packages
        
         | norman784 wrote:
         | I just tried but is really a pain in macOS right now, all went
         | smooth until I got an error while trying to install the bundler
         | gem, I skimmed quickly GitHub and seems to be an issue of macOS
         | and the root dir being read-only, I suppose is too much hassle
         | to worth it, at least if you compare with docker.
         | 
         | As others pointed, the idea behind nix is cool, but it
         | sometimes fall short, hope it get ironed all the issues in
         | macOS so I could give a try in the future.
        
           | Isthatablackgsd wrote:
           | Same, tried Nix on my macOS (MBA M1) back in January. The
           | installation is painless but it ran into an issue in the
           | first run after it. It looks like that I skipped a step
           | somewhere, I was following the guide and it should be working
           | but its not. I suspected it was the guide that someone forgot
           | to include it in the documentation or edge case I
           | experienced. Now the uninstalling part is painful because
           | there bare minimum documentation about this. Tried all
           | different way to remove it and I couldn't. Took me a month to
           | finally remove Nix from my macOS, I found the information
           | through SO.
        
             | LukaD wrote:
             | I had the same exact same experience. If the uninstallation
             | wasn't such a pain in the ass I might even give nix another
             | try in the future.
        
           | soraminazuki wrote:
           | Were you trying to install the Bundler gem as root? If that
           | is the case, I'd recommend against it even without Nix. In
           | any case you can find Bundler in Nixpkgs instead:
           | nix-shell -p bundler
        
         | amelius wrote:
         | > If you are looking for a language agnostic version manager,
         | the nix package manager might be worth a try.
         | 
         | Could it solve the issues we're seeing lately with NPM?
        
         | paskozdilar wrote:
         | For those who like the concept of Nix, but don't like the Nix
         | language, the Guix package manager [0] might also be worth a
         | try. It's an official GNU project, inspired by Nix, and it uses
         | Guile Scheme instead of Nix language.
         | 
         | [0] https://guix.gnu.org/
        
           | javajosh wrote:
           | Eventually someone will implement Nix in Javascript, and then
           | it will explode.
        
             | deepsun wrote:
             | All languages get eventually implemented in Java and
             | Javascript.
        
             | recuter wrote:
             | Figuratively?
        
             | Arubis wrote:
             | In both senses of the word "explode", I expect.
             | 
             | (Tongue-in-cheek, but I'd actually like to see this happen:
             | Nix is a fantastic concept obscured by space-alien syntax.)
        
             | zeec123 wrote:
             | Not exactly, but PureNix
        
             | sleepydog wrote:
             | The Guile compiler has a JavaScript frontend. You can write
             | guix packages in JavaScript:
             | 
             | https://lists.gnu.org/archive/html/guix-
             | devel/2022-03/msg001...
        
               | marius_k wrote:
               | js code example still looks schemish to me.
        
             | SkyMarshal wrote:
             | Nix is mostly already Javascript. Just JSON with some addon
             | functionality.
        
             | rgoulter wrote:
             | The code in nixpkgs does contain some code that uses
             | relatively sophisticated programming language constructs,
             | such as lazy evaluation, partial function application, or
             | fixpoints. -- So I'll say there's at least some friction to
             | Nix from the language being pure/functional.
             | 
             | Mostly I think Nix would be just as hard if packages were
             | expressed in any language.
             | 
             | Stuff like "this program compiled by nix is using a
             | different glibc than this library" is going to be confusing
             | regardless of whether Nix expressions can be written with
             | JavaScript; or stuff like some program assumes it can write
             | to $HOME in its build script not playing nicely with Nix.
             | 
             | A lot of why Nix is hard is because it's weird, and that
             | even as an end user when things go wrong it may require
             | understanding more about what's going on than what other
             | solutions require.
        
           | goodpoint wrote:
           | Guix is much more usable.
        
         | bronzecarnage wrote:
         | My biggest gripe with nix is that you need sudo rights to get
         | it running properly on another distro. I know you can do the
         | nix-user-chroot thing, but it's not possible on machines where
         | kernel namespaces aren't accessible for unprivileged users.
         | 
         | I spent time understanding it, and getting it working, but it
         | really doesn't work just universally. Once the install process
         | becomes more like, say, miniconda -- where an unprivileged user
         | can install it locally with ease -- nix will get a massive
         | boost in my books. Until then, I can only yearn.
        
           | ris wrote:
           | It is possible to use from a completely unprivileged
           | environment by putting the nix store in your home directory
           | instead of `/nix`. _But_ (and it 's a big but) you'll then
           | have to build all packages from scratch because the hashes
           | for you packages will be different to the ones in the nix
           | binary cache.
        
       | yeti_or wrote:
       | I like to use eclectica, it's not very popular, but it works for
       | me
       | 
       | https://github.com/markelog/eclectica
        
       | 3836293648 wrote:
       | Is this just low effort low compatibility nix?
        
       | xwowsersx wrote:
       | > And then one day, I found out about asdf-vm.
       | 
       | FYI, the link to asdf there is a link to google.com
        
         | KptMarchewa wrote:
         | I thought it's a joke post after that, but apparently this is a
         | real project: https://github.com/asdf-vm/asdf
        
           | xwowsersx wrote:
           | haha, I have to admit I also started to wonder if this was an
           | April Fools' joke about how Google searches are a developer's
           | main tool.
        
       | derekzhouzhen wrote:
       | There is a age old solution for managing multiple versions of the
       | same software: gnu stow: https://www.gnu.org/software/stow/
       | 
       | No crazy settings in your profile. Downsides are: You need to
       | have root, you can switch any time but different versions don't
       | work at the same time, and it does not work in windows.
        
         | thingification wrote:
         | > You need to have root
         | 
         | This isn't true
         | 
         | > different versions don't work at the same time
         | 
         | Within one stow directory: true. But nothing prevents creating
         | multiple directories (I don't think I've ever done that).
        
           | derekzhouzhen wrote:
           | You are right, I should have said to manipulate /usr/loca/
           | you need to be root.
        
         | akira2501 wrote:
         | I feel like hardcoding shebang paths and not implementing a
         | good widespread PATH whitelisting/safety mechanism has created
         | far more problems than we should ever have had to deal with.
         | 
         | It strikes me that not for the two above items we might be able
         | to solve this with $PATH resolution and directories filled with
         | symlinks to our "development versions."
        
       | thejosh wrote:
       | There is an issue that delays commands by 200ms, which isn't a
       | massive issue for my usecase, but you might want to look into
       | asdf-exec https://github.com/danhper/asdf-exec
        
       | password4321 wrote:
       | Both my thumbs up for the asdf extendable version manager, a big
       | help when brew leaves older macOS editions behind.
       | 
       | Previously: https://news.ycombinator.com/item?id=26018684 (Feb
       | 2021: 98 comments)
        
       | d3k wrote:
       | It seems nice. When programming envs tend too complicated though,
       | I tend to switch to docker: a given image will handle a given
       | version and it's mostly hassle free. That probably would not make
       | sense on macOS or Windows, if you want to run native versions.
        
         | Ajedi32 wrote:
         | This. Docker not only solves the language-specific venv
         | problem, but also encapsulates other system-level dependencies
         | that may not be covered by stuff like pyenv or nvm. Plus with
         | docker-compose you can trivially satisfy other, way more
         | complicated dependencies like "fully functional PostgreSQL DB
         | is accessible over the network", _and_ you can deploy the
         | entire thing to production with a few simple commands.
        
         | brightball wrote:
         | One thing that I realized after finally dabbling with Python
         | after years in other languages was just how much Python _needs_
         | Docker in development. There are so many details to get the
         | right version of python working on a project because of system
         | level assumptions that using Python without Docker is a huge
         | pain.
         | 
         | Conversely, the experience of using Ruby within Docker for
         | development is often clunky and awkward by comparison.
        
           | 0xedd wrote:
           | Installing dependencies, per the docs, before installing
           | python works well. Installing library dependencies for
           | packages also works well. It's not dissimilar to compiling
           | c/c++ where you have to read the installation docs. And the
           | docs better be updated.
        
           | robertlagrant wrote:
           | I've not found this; pyenv and poetry sort it all out for me,
           | and I could simplify and just make do with one.
        
         | matsemann wrote:
         | Same. Getting a python environment up and running can be a
         | multi-day endeavor if you're unlucky. Just using docker compose
         | on the existing Dockerfile for the project and mounting the
         | local filesystem, means everything just works. PyCharm now
         | works nicely with a remote interpreter inside docker compose.
         | 
         | I've even tried doing that with all the devtools we have. Like
         | normally a developer here has to install gcloud, terraform,
         | kubectl, apt-get lots of stuff, and then 3-4 internal tools.
         | Then configure all of it, and of course some stuff will just
         | not work on someone's computer. But creating a docker image
         | including all that means that I can grab a new computer and be
         | up and running in minutes.
        
           | hushpuppy wrote:
           | I regularly use asdf-vm to manage kubectl, python, nodejs,
           | and a bunch of other stuff.
           | 
           | "Setting up a Python environment" takes about 10 minutes and
           | it's dead nuts reliable.
           | 
           | It is a very effective package manager.
        
           | antholeole wrote:
           | Hijacking this: does anyone know how to get vscode to use a
           | python interpreter inside a docker container for linting?
           | I've resorted to using the docker container, but also having
           | a python env so that I can tell vscode to point to the python
           | interpreter in the env to get linting. Otherwise,
           | dependencies come up unresolved.
           | 
           | I did some googling, but I'm unfortunately not experienced
           | enough to be able to describe the problem succinctly to
           | google.
           | 
           | Using pylance, btw.
           | 
           | TIA!
        
             | nevalsar wrote:
             | Try this: 1. Bring up command palette using `Ctrl+Shift+p`
             | 2. Search and select "Python: Select Interpreter" 3. Select
             | your Python environment.
             | 
             | This works in VSCode over SSH perfectly fine - the locally
             | running VSCode is able to detect and select Python
             | environments in the remote server.
        
               | antholeole wrote:
               | The trouble with this is that the python environment is
               | in the container - In step 2, id need to type path to the
               | interpreter that it inside the container.
               | 
               | Although, now you've got me thinking what would happen if
               | I mounted the interpreter inside the container to
               | something local that I can point to? Might try this
               | later, thanks for the help!
        
             | matsemann wrote:
             | Have you tried VSCode's remote abilities? Should do exactly
             | as you describe.
             | https://code.visualstudio.com/docs/remote/remote-overview
             | or https://devblogs.microsoft.com/python/remote-python-
             | developm...
        
               | antholeole wrote:
               | I've seen these and got it to work this way. I'm not too
               | fond of working inside the container as it's just a
               | little more friction, but I've been working this way for
               | a little bit now. I was hoping to avoid working in the
               | container.
        
       | kaladin_1 wrote:
       | I like the idea. A package manager that can be used on several
       | languages but simple enough to pick up in 15mins or less.
       | 
       | Just today on trying to get rvm to do something I got angry at
       | the number of language-specific package managers I have
       | installed: nvm, jenv, rvm, rbenv(after I couldn't get rvm...)
       | 
       | Of course, I know about Nix but it is too complex for my use
       | cases.
        
       | dangoor wrote:
       | I recently discovered Hermit[1], which is a really
       | straightforward tool for managing versions of tools for a given
       | project. From the FAQ[2]:
       | 
       | > Hermit is probably most similar to asdf, but their goals
       | differ. Hermit's goal is to make isolated cross-platform tooling
       | consistent, self-bootstrapping, and reproducible at the project
       | level. asdf's primary goal is to allow developers to install and
       | switch between multiple versions of languages and tooling.
       | 
       | The downside for the author of this post, though, is that Hermit
       | doesn't yet support Ruby because it's not static/relocatable.
       | 
       | [1]: https://cashapp.github.io/hermit/ [2]:
       | https://cashapp.github.io/hermit/faq/#asdf
        
         | huac wrote:
         | Hermit is great!
        
       | bjourne wrote:
       | Can someone give like the 120 seconds elevator pitch to why you
       | need any of this stuff? I know _how_ to use pyenv, virtualenv,
       | Poetry, autoenv, you name it. I just never have found any
       | practical use for it. But what if you want to have multiple
       | versions of the same package installed? I don 't. If some project
       | I work on requires tf 2.x-1.0 and I only have tf 2.x.0 then I
       | just rm -rf ~/.local/lib/python3.x and reinstall the dependencies
       | anew. Furthermore, most Python maintainers do a terrific job in
       | keeping up with breaking api changes in their dependencies (which
       | I'm very grateful for) so it's quite rare that I need to use a
       | Python package that is not the current release.
        
         | dsabanin wrote:
         | What if you work on 2-10 different codebases that all use
         | slightly different versions?
        
           | [deleted]
        
         | haolez wrote:
         | This probably makes a difference for hugo enterprise monorepos.
         | I myself have a workflow similar to yours, but with the
         | following mindset: my local environment is an approximation of
         | what will be in production. I don't need every version to match
         | and if I ever encounter a corner case where this is not true,
         | I'll just deal with it and move on.
        
         | roesel wrote:
         | What if you're simultaneously working on two projects with
         | different version requirements and don't want to rm -rf and
         | reinstall every day?
        
           | bjourne wrote:
           | I don't do that.
        
       | synergy20 wrote:
       | for bash I use venv, nvm and gvm(more popular than goenv and
       | worked well), worked fine so far.
        
       | [deleted]
        
       | mjs7231 wrote:
       | This feels like Trillian for virtualenvs. So typical that as
       | engineers we keep abstracting everything we can until we run out
       | of people that understand the basics. This tool looks like a
       | great resource until step 4 when we create a virtualenv protocol.
       | In chat clients, the protocols came first. For development IDEs
       | adding auto-complete, it seems the protocol LSP came second. It's
       | happening to language virtualenvs now as well.
       | 
       | 1. You need a tool for X to solve an issue so you write it. (AIM)
       | 
       | 2. Guy over there needs a tool for Y to solve the same issue, so
       | he writes it. (Yahoo Chat)
       | 
       | 3. So many tools exist, we need to merge them all into one.
       | (Trillian, Adium)
       | 
       | 4. Merging all the tools created a monster, we need a common
       | protocol they all understand.
       | 
       | 5. No one remembers how tool X works anymore, updates become more
       | sparse.
       | 
       | 6. Both X and Y are no longer popular, big company took over.
       | (Slack)
        
       | e12e wrote:
       | I've found asdf to be a reasonable choice when needing to manage
       | more than one language - especially where there are good "native"
       | version managers that asdf wrap (eg: python, ruby, node, to a
       | certain extent rust/cargo).
       | 
       | Not sure I'd do this, though:                   mkdir -p
       | ~/.config/fish/completions         cp
       | ~/.asdf/completions/asdf.fish ~/.config/fish/completions
       | 
       | But more probably add a symlink to the completions managed by
       | git/asdf: ln -s ~/.asdf/completions/asdf.fish
       | ~/.config/fish/completions/
        
       ___________________________________________________________________
       (page generated 2022-04-05 23:00 UTC)