@@ -114,6 +114,20 @@ impl WatchEnvTracker {
114114 let key_os = OsString :: from ( key) ;
115115 let value_os = OsString :: from ( value) ;
116116
117+ // Process-level env vars should always take precedence over env files.
118+ if inner. original_env . contains_key ( & key_os) {
119+ #[ allow( clippy:: print_stderr) ]
120+ if log_level. map ( |l| l >= log:: Level :: Debug ) . unwrap_or ( false ) {
121+ eprintln ! (
122+ "{} Variable '{}' already exists in the process environment, skipping value from '{}'" ,
123+ colors:: yellow( "Debug" ) ,
124+ key_os. to_string_lossy( ) ,
125+ file_path. display( )
126+ ) ;
127+ }
128+ continue ;
129+ }
130+
117131 // Check if this variable is already loaded from a previous file
118132 if inner. loaded_variables . contains ( & key_os) {
119133 // Variable already exists from a previous file, skip it
@@ -241,16 +255,46 @@ pub fn load_env_variables_from_env_files(
241255 return ;
242256 } ;
243257
244- for env_file_name in env_file_names. iter ( ) {
245- match deno_dotenv:: from_path ( env_file_name) {
246- Ok ( _) => ( ) ,
258+ let original_env_keys: HashSet < OsString > =
259+ env:: vars_os ( ) . map ( |( key, _) | key) . collect ( ) ;
260+ let mut loaded_keys = HashSet :: new ( ) ;
261+
262+ for env_file_name in env_file_names. iter ( ) . rev ( ) {
263+ let iter = match deno_dotenv:: from_path_sanitized_iter ( env_file_name) {
264+ Ok ( iter) => iter,
247265 Err ( error) => {
248266 WatchEnvTracker :: handle_dotenv_error (
249267 error,
250268 env_file_name,
251269 flags_log_level,
252270 ) ;
271+ continue ;
272+ }
273+ } ;
274+
275+ for item in iter {
276+ let ( key, value) = match item {
277+ Ok ( pair) => pair,
278+ Err ( error) => {
279+ WatchEnvTracker :: handle_dotenv_error (
280+ error,
281+ env_file_name,
282+ flags_log_level,
283+ ) ;
284+ break ;
285+ }
286+ } ;
287+
288+ let key_os = OsString :: from ( key) ;
289+ if original_env_keys. contains ( & key_os) || loaded_keys. contains ( & key_os) {
290+ continue ;
291+ }
292+
293+ // SAFETY: We're setting environment variables with sanitized key/value strings from a .env file.
294+ unsafe {
295+ env:: set_var ( & key_os, value) ;
253296 }
297+ loaded_keys. insert ( key_os) ;
254298 }
255299 }
256300}
0 commit comments