I got your use case to work by just using the normal dotenv plugin.
In my serverless.yaml, I specify environment variables to be loaded from a file based on the stage parameter (dev is default):
provider:
stage: ${opt:stage, 'dev'}
environment:
FOO: ${file(./config.${self:provider.stage}.js):getEnvVars.FOO}
BAR: ${file(./config.${self:provider.stage}.js):getEnvVars.BAR}
Then one file per stage that loads the environment variables from the right .env file:
config.dev.js:
require('dotenv').config({path: __dirname + '/dev.env'});
const config = require('./environmentVariables.js');
module.exports.getEnvVars = config.getEnvVars;
config.production.js:
require('dotenv').config({path: __dirname + '/production.env'});
const config = require('./environmentVariables.js');
module.exports.getEnvVars = config.getEnvVars;
Instead of exporting every environment variables in each of the above config files, I created a helper file for this (environmentVariables.js):
module.exports.getEnvVars = () => ({
FOO: process.env.FOO,
BAR: process.env.BAR
});
Last but not least the .env files containing the actual variables. I named the files dev.env and production.env.
FOO=foo
BAR=bar
It works like a charm, the only downside being that you have to edit several different files whenever you want to add a new environment variable.