@@ -145,7 +145,7 @@ func WithDefaultConfigPath(o *ProjectOptions) error {
145
145
// WithEnv defines a key=value set of variables used for compose file interpolation
146
146
func WithEnv (env []string ) ProjectOptionsFn {
147
147
return func (o * ProjectOptions ) error {
148
- for k , v := range getAsEqualsMap (env ) {
148
+ for k , v := range utils . GetAsEqualsMap (env ) {
149
149
o .Environment [k ] = v
150
150
}
151
151
return nil
@@ -169,7 +169,7 @@ func WithLoadOptions(loadOptions ...func(*loader.Options)) ProjectOptionsFn {
169
169
170
170
// WithOsEnv imports environment variables from OS
171
171
func WithOsEnv (o * ProjectOptions ) error {
172
- for k , v := range getAsEqualsMap (os .Environ ()) {
172
+ for k , v := range utils . GetAsEqualsMap (os .Environ ()) {
173
173
if _ , set := o .Environment [k ]; set {
174
174
continue
175
175
}
@@ -188,62 +188,76 @@ func WithEnvFile(file string) ProjectOptionsFn {
188
188
189
189
// WithDotEnv imports environment variables from .env file
190
190
func WithDotEnv (o * ProjectOptions ) error {
191
- dotEnvFile := o .EnvFile
191
+ wd , err := o .GetWorkingDir ()
192
+ if err != nil {
193
+ return err
194
+ }
195
+ envMap , err := GetEnvFromFile (o .Environment , wd , o .EnvFile )
196
+ if err != nil {
197
+ return err
198
+ }
199
+ for k , v := range envMap {
200
+ o .Environment [k ] = v
201
+ }
202
+ return nil
203
+ }
204
+
205
+ func GetEnvFromFile (currentEnv map [string ]string , workingDir string , filename string ) (map [string ]string , error ) {
206
+ envMap := make (map [string ]string )
207
+
208
+ dotEnvFile := filename
192
209
if dotEnvFile == "" {
193
- wd , err := o .GetWorkingDir ()
194
- if err != nil {
195
- return err
196
- }
197
- dotEnvFile = filepath .Join (wd , ".env" )
210
+ dotEnvFile = filepath .Join (workingDir , ".env" )
198
211
}
199
212
abs , err := filepath .Abs (dotEnvFile )
200
213
if err != nil {
201
- return err
214
+ return envMap , err
202
215
}
203
216
dotEnvFile = abs
204
217
205
218
s , err := os .Stat (dotEnvFile )
206
219
if os .IsNotExist (err ) {
207
- if o . EnvFile != "" {
208
- return errors .Errorf ("Couldn't find env file: %s" , o . EnvFile )
220
+ if filename != "" {
221
+ return nil , errors .Errorf ("Couldn't find env file: %s" , filename )
209
222
}
210
- return nil
223
+ return envMap , nil
211
224
}
212
225
if err != nil {
213
- return err
226
+ return envMap , err
214
227
}
215
228
216
229
if s .IsDir () {
217
- if o . EnvFile == "" {
218
- return nil
230
+ if filename == "" {
231
+ return envMap , nil
219
232
}
220
- return errors .Errorf ("%s is a directory" , dotEnvFile )
233
+ return envMap , errors .Errorf ("%s is a directory" , dotEnvFile )
221
234
}
222
235
223
236
file , err := os .Open (dotEnvFile )
224
237
if err != nil {
225
- return err
238
+ return envMap , err
226
239
}
227
240
defer file .Close ()
228
241
229
242
env , err := dotenv .ParseWithLookup (file , func (k string ) (string , bool ) {
230
- v , ok := o . Environment [k ]
243
+ v , ok := currentEnv [k ]
231
244
if ! ok {
232
245
233
246
return "" , false
234
247
}
235
248
return v , true
236
249
})
237
250
if err != nil {
238
- return err
251
+ return envMap , err
239
252
}
240
253
for k , v := range env {
241
- if _ , set := o . Environment [k ]; set {
254
+ if _ , set := currentEnv [k ]; set {
242
255
continue
243
256
}
244
- o . Environment [k ] = v
257
+ envMap [k ] = v
245
258
}
246
- return nil
259
+
260
+ return envMap , nil
247
261
}
248
262
249
263
// WithInterpolation set ProjectOptions to enable/skip interpolation
@@ -412,22 +426,3 @@ func absolutePaths(p []string) ([]string, error) {
412
426
}
413
427
return paths , nil
414
428
}
415
-
416
- // getAsEqualsMap split key=value formatted strings into a key : value map
417
- func getAsEqualsMap (em []string ) map [string ]string {
418
- m := make (map [string ]string )
419
- for _ , v := range em {
420
- kv := strings .SplitN (v , "=" , 2 )
421
- m [kv [0 ]] = kv [1 ]
422
- }
423
- return m
424
- }
425
-
426
- // getAsEqualsMap format a key : value map into key=value strings
427
- func getAsStringList (em map [string ]string ) []string {
428
- m := make ([]string , 0 , len (em ))
429
- for k , v := range em {
430
- m = append (m , fmt .Sprintf ("%s=%s" , k , v ))
431
- }
432
- return m
433
- }
0 commit comments