Ionic 7 + Vue/Vite + Capacitor 5 set .env file for ionic capacitor run

Hi, i want to execute “ionic capacitor run android -l --external” to run my project on android. How can i set the .env-file to use? i have a .env file and an .env.mobile but i cant find the option so set the env file to .env.mobile. I tried “–mode mobile” without a result.

I’ve done it with angular, hope it can be helpful

for example, this is how my file looks (i’ve added staging)
image

and my angular.json
 "configurations": {
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "5mb"
                }
              ]
            },
            "staging": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.staging.ts"
                }

when i need to run a certain env i add the parameter --configuration=staging

–configuration=NAMEOFYOURENV

@kstk let us know if this example helped. If so, I’ll mark the solution and close the thread!

This should work for you, but you will need to install dotenv npm package

vite.config.json

import legacy from "@vitejs/plugin-legacy";
import vue from "@vitejs/plugin-vue";
import path from "path";
import { defineConfig } from "vite";
import dotenv from "dotenv";

export default defineConfig(({ mode }) => {
  const envFiles = {
    development: ".env.development",
    mobile: ".env.mobile",
  };

  const envFile = dotenv.config({ path: envFiles[mode] }).parsed;

  console.log(envFile);

  return {
    plugins: [vue(), legacy()],
    resolve: {
      alias: {
        "@": path.resolve(__dirname, "./src"),
      },
    },
    test: {
      globals: true,
      environment: "jsdom",
    },
    // Other Vite configurations...
    define: {
      "process.env": JSON.stringify(envFile),
    },
  };
});

.env.development

VITE_API_BASE_URL=https://development.example.com
VITE_DEBUG=true

.env.mobile

VITE_API_BASE_URL=https://mobile.example.com
VITE_DEBUG=true

Output with vite --mode development

aaronksaunders@Aarons1ProM1Pro ionicIssues % vite --mode development
{
  VITE_API_BASE_URL: 'https://development.example.com',
  VITE_DEBUG: 'true'
}

  VITE v4.3.9  ready in 350 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

Output with vite --mode mobile

aaronksaunders@Aarons1ProM1Pro ionicIssues % vite --mode mobile
{
  VITE_API_BASE_URL: 'https://mobile.example.com',
  VITE_DEBUG: 'false'
}

  VITE v4.3.9  ready in 350 ms

  ➜  Local:   http://localhost:5173/
  ➜  Network: use --host to expose
  ➜  press h to show help

Access Values In Code

const VITE_API_BASE_URL = import.meta.env.VITE_API_BASE_URL

Thank you for your answers!

no problem, I have a bunch of Ionic Vue Content here, so feel free to reach out here in forum or in Discord I try to help out

For posterity, I got around this by running ‘ionic capacitor run android -l --external – --mode staging’ and have a .env.staging file in the same directory. The only way I knew that ‘–’ would work is because I asked chatGPT, I wish capacitor documented that there is a way to pass options to vite underneath.