-
-
Notifications
You must be signed in to change notification settings - Fork 27
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Multiline value #28
Comments
@david-arteaga thanks for the ticket I created a quick simple test to try and recreate your issue Here is my
Here is a quick Java test (included only the relevant bits) ...
private val envVars = mapOf(
"MULTI_LINE" to "hello\\nworld"
)
...
@test
fun multiLine() {
val dotenv = Dotenv.configure()
.ignoreIfMalformed()
.load()
assertEquals(dotenv["MULTI_LINE"]!!, envVars["MULTI_LINE"]!!)
} The above test passes. Can you provide the Thanks |
Ok so I played around with some examples and I think I got to the issue. This is my
This is the code I am running public static void main(String[] args) {
String multilineString = "1\n2";
Dotenv d = Dotenv.load();
String multilineFromDotEnv = d.get("MULTILINE");
System.out.println("Characters from multiline");
printChars(multilineString);
System.out.println("\n\nCharacters from dotenv");
printChars(multilineFromDotEnv);
System.out.println("\n\nPrinted string with multiline");
System.out.println(multilineString);
System.out.println("Printed string from dotenv");
System.out.println(multilineFromDotEnv);
System.out.println("\n\nAre they equal? : " + multilineString.equals(multilineFromDotEnv));
}
private static void printChars(String all) {
all.chars().forEach(System.out::println);
} This is the output I get:
So as you can see in the character list from dotenv, the characters get interpreted literally, as a I would expect for there to be a way to actually have a real multiline string from dotenv. I ran into this problem trying to use a I can imagine there are many other use cases for this, but this is the one I found. I want the string that is loaded from dotenv to actually have the newline character in the string, not to have the Is there any way to do this with the library? |
Thanks for the details. This is helpful. Will have a look |
I ran a few more tests. Ultimately, Java's Here is the test. It's essentially an extension of yours package tests;
import io.github.cdimascio.dotenv.Dotenv;
import java.util.ArrayList;
import java.util.List;
public class Test
{
public static void main(String[] args) {
String multilineString = "1\n2";
Dotenv d = Dotenv.configure().ignoreIfMalformed().load();
String multilineFromDotEnv = d.get("MULTILINE");
String multilineFromSytemEnv = System.getenv("MULTILINE");
System.out.println("Characters from");
System.out.println(" - multiline: " + collectChars(multilineString));
System.out.println(" - dotenv : " + collectChars(multilineFromDotEnv));
System.out.println(" - System : " + collectChars(multilineFromSytemEnv));
System.out.println();
System.out.println("String from");
System.out.println(" - multiline: " + multilineString);
System.out.println(" - dotenv : " + multilineFromDotEnv);
System.out.println(" - System : " + multilineFromSytemEnv);
System.out.println();
System.out.println("Does System.getenv(...) equal dotenv.get(...): " + multilineFromSytemEnv.equals(multilineFromDotEnv));
System.out.println("Does System.getenv equal multiline String? : " + multilineString.equals(multilineFromSytemEnv));
System.out.println("Does dotenv.get equal multiline String? : " + multilineString.equals(multilineFromSytemEnv));
}
private static List<Integer> collectChars(String all) {
return all.chars().collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
}
} |
All in all, this still begs the question, how do you solve your original issue. Here's a suggestion. Base 64 encode the multi-line value in the EV, and decode it after its read in. # EVs
MULTILINE=1\n2
# base 64 encoded version of string above
B64_MULTI_LINE=MQoy package tests;
import io.github.cdimascio.dotenv.Dotenv;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
public class Test
{
public static void main(String[] args) {
String multilineString = "1\n2";
runWith("MULTILINE", "1\n2");
System.out.println("=================");
String encodedString = Base64.getEncoder().encodeToString(multilineString.getBytes());
runWith("B64_MULTI_LINE", encodedString);
byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
System.out.println(new String(decodedBytes));
}
public static void runWith(String ev, String multilineString) {
Dotenv d = Dotenv.configure().ignoreIfMalformed().load();
String multilineFromDotEnv = d.get(ev);
String multilineFromSytemEnv = System.getenv(ev);
System.out.println("Characters from");
System.out.println(" - multiline: " + collectChars(multilineString));
System.out.println(" - dotenv : " + collectChars(multilineFromDotEnv));
System.out.println(" - System : " + collectChars(multilineFromSytemEnv));
System.out.println();
System.out.println("String from");
System.out.println(" - multiline: " + multilineString);
System.out.println(" - dotenv : " + multilineFromDotEnv);
System.out.println(" - System : " + multilineFromSytemEnv);
System.out.println();
System.out.println("Does System.getenv(...) equal dotenv.get(...): " + multilineFromSytemEnv.equals(multilineFromDotEnv));
System.out.println("Does System.getenv equal multiline String? : " + multilineString.equals(multilineFromSytemEnv));
System.out.println("Does dotenv.get equal multiline String? : " + multilineString.equals(multilineFromSytemEnv));
String encodedString = Base64.getEncoder().encodeToString(multilineString.getBytes());
}
private static List<Integer> collectChars(String all) {
return all.chars().collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
}
} Hope this helps |
Yeah Base64 definitely gets the job done. Did not occur to me at the moment so ended up putting something like |
Done. I’ve added a note in the FAQ section. |
Just for reference the FAQ section is here |
Is there any way to use a multi-line value in the
.env
file?I've tried using double quotes, single quotes, backticks plus the
\n
char but I get the literal\n
characters in the string when evaluated in Java code.The text was updated successfully, but these errors were encountered: