How to Seamlessly Manage Programming Languages in Your Projects

In today’s fast-paced development world, managing multiple programming languages and tools across various projects can quickly become a headache. That’s where version managers that simplify the process of handling different versions of languages and dependencies. Whether you’re juggling Node.js, Ruby, Python, or any other language Version managers allow you to effortlessly switch between versions, ensuring your projects always run on the right setup.

Jordan Wu profile picture

Jordan Wu

4 min read·Posted 

Several Trees During Sunset Image.
Several Trees During Sunset Image.
Table of Contents

Version Managers

A version manager is a tool that allows developers to manage and switch between different versions of programming languages, frameworks, and tools across multiple projects. It ensures that each project uses the appropriate version of a language or tool, preventing conflicts and compatibility issues. With a version manager, you can install, update, and manage specific versions globally or locally for each project, allowing for a consistent and controlled development environment.

asdf

asdf is a universal version manager that enables developers to manage multiple versions of programming languages and tools from a single interface. It supports a wide variety of languages and tools, including Node.js, Ruby, Python, Java, Go, and more, through plugins. With asdf, you can set global or project-specific versions, ensuring that each project uses the right tool version. It simplifies version management by allowing automatic switching based on the project's .tool-versions file, providing a consistent and hassle-free development environment across different languages. This makes asdf an essential tool for developers working with multiple technologies.

asdf has been my go to tool when starting a new project. I always setup what version of programming languages I will be using, it's usually the latest stable version. Programming languages are continuously evolving, with frequent new versions being released. As a result, it's crucial to manage the versions you use and plan for incremental upgrades to enhance security and unlock other benefits of the newer versions.

mise

mise is a modern version manager designed to manage multiple versions of programming languages, tools, and dependencies across your projects. It simplifies the process of installing, updating, and switching between different versions of languages like Node.js, Python, Ruby, and more, all within a single interface. Similar to asdf, mise can be used as a drop-in replacement for asdf while supporting environment variables and tasks.

Now mise is my go to tool for managing all my programming languages for all my projects. I really like how it helps you manage your environment variables within mise.toml file. It can handle secrets as well.

Both environment variables and secrets are used to store configuration values, but they have different purposes and security considerations.

  1. Environment Variables
  • These are key-value pairs used to configure applications without hardcoding values into the codebase.
  • Examples:
    • PORT=3000 (Defines which port the app runs on)
    • NODE_ENV=production (Specifies the environment: development, testing, or production)
    • DATABASE_URL=postgres://user:pass@localhost:5432/mydb (Database connection string)
  • Key Traits:
    • ✅ Typically safe for non-sensitive configurations
    • ✅ Can be stored in .env files, cloud environment settings, or CI/CD pipelines
    • ✅ Helps make apps more portable across different environments
  1. Secrets
  • Secrets are a subset of environment variables that contain sensitive information, such as API keys, passwords, and private tokens.
  • Examples:
    • SECRET_KEY=supersecurekey123
    • AWS_ACCESS_KEY_ID=ACCESS_KEY...
    • DB_PASSWORD=mysecretpassword
  • Key Traits:
    • 🚨 Sensitive Information – Should never be exposed in logs, code, or version control
    • 🚨 Stored Securely – Managed via secret management tools like:
      • AWS Secrets Manager
      • HashiCorp Vault
      • Kubernetes Secrets
      • .env files (with .gitignore to prevent committing them)
    • 🚨 Restricted Access – Only authorized systems and users should have access

You can define tasks in mise.toml files or as standalone shell scripts. These are useful for things like running linters, tests, builders, servers, and other tasks that are specific to a project. Now you will know where to find all the scripts and what is available when working in any project!

Once installed it's recommend to Activate mise. Once activated, mise can automatically switch between different versions of tools based on the directory you're in. This means that if you have a project that requires Node.js 18 and another that requires Node.js 22, mise will automatically switch between them as you move between the two projects. Check out what tools are available in the registry.

Lastly here's how to add zsh plugin for mise.

Summary

Selecting the right version manager is crucial for maintaining an efficient development workflow. In my projects, which often involve multiple programming languages, I rely on mise as my preferred tool. It streamlines project management by handling language versions, environment variables, and tasks, ensuring a clean and organized setup. Version managers like mise and asdf are widely used in open-source communities and professional environments. Gaining a solid understanding of these tools is essential for a smooth development process and successful project execution.

About the Author

Jordan Wu profile picture
Jordan is a full stack engineer with years of experience working at startups. He enjoys learning about software development and building something people want. What makes him happy is music. He is passionate about finding music and is an aspiring DJ. He wants to create his own music and in the process of finding is own sound.
Email icon image
Stay up to date

Get notified when I publish something new, and unsubscribe at any time.