From a942d5cdfcd849d2eb0112d0e135c274f26a879f Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Tue, 1 Jul 2025 01:47:26 -0300 Subject: [PATCH] Add support for .env files Loads from user home dir too. --- src/Samples/.env | 1 + src/Samples/Program.cs | 1 + .../{ConsoleInitializer.cs => AppInitializer.cs} | 10 +++++++++- src/Weaving/Weaving.csproj | 1 + src/Weaving/Weaving.props | 1 + src/Weaving/readme.md | 15 +++++++++++++++ 6 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 src/Samples/.env rename src/Weaving/{ConsoleInitializer.cs => AppInitializer.cs} (57%) diff --git a/src/Samples/.env b/src/Samples/.env new file mode 100644 index 0000000..15c36f5 --- /dev/null +++ b/src/Samples/.env @@ -0,0 +1 @@ +FOO=BAR \ No newline at end of file diff --git a/src/Samples/Program.cs b/src/Samples/Program.cs index 28e20ae..e3ca628 100644 --- a/src/Samples/Program.cs +++ b/src/Samples/Program.cs @@ -5,6 +5,7 @@ { "user", "What's Tesla stock worth today? Search X and the news for latest info." }, }; +// Env supports .env as well as all standard .NET configuration sources var grok = new GrokClient(Env.Get("XAI_API_KEY")!, new GrokClientOptions() .UseJsonConsoleLogging(new() { WrapLength = 80 })); diff --git a/src/Weaving/ConsoleInitializer.cs b/src/Weaving/AppInitializer.cs similarity index 57% rename from src/Weaving/ConsoleInitializer.cs rename to src/Weaving/AppInitializer.cs index 4ffc3b5..c9111e9 100644 --- a/src/Weaving/ConsoleInitializer.cs +++ b/src/Weaving/AppInitializer.cs @@ -4,7 +4,7 @@ namespace Weaving; -class ConsoleInitializer +class AppInitializer { #pragma warning disable CA2255 // The 'ModuleInitializer' attribute should not be used in libraries [ModuleInitializer] @@ -13,5 +13,13 @@ public static void Init() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) Console.InputEncoding = Console.OutputEncoding = Encoding.UTF8; + + // Load environment variables from .env files in current dir and above. + DotNetEnv.Env.TraversePath().Load(); + + // Load environment variables from user profile directory. + var userEnv = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".env"); + if (File.Exists(userEnv)) + DotNetEnv.Env.Load(userEnv); } } diff --git a/src/Weaving/Weaving.csproj b/src/Weaving/Weaving.csproj index 078a1ae..e61e8c9 100644 --- a/src/Weaving/Weaving.csproj +++ b/src/Weaving/Weaving.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Weaving/Weaving.props b/src/Weaving/Weaving.props index 2a50111..24de5bf 100644 --- a/src/Weaving/Weaving.props +++ b/src/Weaving/Weaving.props @@ -30,6 +30,7 @@ + \ No newline at end of file diff --git a/src/Weaving/readme.md b/src/Weaving/readme.md index d022264..ed0a0d5 100644 --- a/src/Weaving/readme.md +++ b/src/Weaving/readme.md @@ -29,6 +29,21 @@ AnsiConsole.MarkupLine($":robot: {response.Text}"); > The most useful namespaces and dependencies for developing Microsoft.Extensions.AI- > powered applications are automatically referenced and imported when using this package. +## Configuration / Environment Variables + +The `Env` class provides access to the following variables/configuration automatically: + +* `.env` files: in local and parent directories +* `~/.env` file: in the user's home directory (`%userprofile%\.env` on Windows) +* All default configuration sources from [App Builder](https://learn.microsoft.com/en-us/dotnet/core/extensions/generic-host?tabs=appbuilder#host-builder-settings): + * Environment variables prefixed with DOTNET_. + * Command-line arguments. + * appsettings.json. + * appsettings.{Environment}.json. + * Secret Manager when the app runs in the Development environment. + * Environment variables. + * Command-line arguments. + \ No newline at end of file