วิธีอ่านตัวแปรสภาพแวดล้อมใน Scala


คำตอบ:


232

ตั้งแต่ Scala 2.9 คุณสามารถใช้เอsys.envฟเฟกต์เดียวกันได้:

scala> sys.env("HOME")
res0: String = /home/paradigmatic

ฉันคิดว่าเป็นเรื่องดีที่จะใช้ Scala API แทน Java ขณะนี้มีหลายโครงการที่จะรวบรวม Scala ไปยังแพลตฟอร์มอื่นที่ไม่ใช่ JVM (. NET, javascript, native ฯลฯ ) การลดการพึ่งพา Java API จะทำให้โค้ดของคุณพกพาได้มากขึ้น


96
อาจเป็นการใช้งานsys.env.get("VARIABLE")ที่ดีกว่าซึ่งจะทำให้คุณOption[String]มีข้อผิดพลาดมากกว่าหากเกิดข้อผิดพลาดหากตัวแปรนั้นหายไป
Cristian Vrabie

4
@CristianVrabie ฉันต้องการมันมากในกรณีส่วนใหญ่ แต่เป็นเพียงsys.env Mapคุณสามารถใช้วิธีการใดก็ได้ที่เหมาะสมกับคุณ
กระบวนทัศน์

3
sys.env.getOrElse("VARIABLE", "default value")ก็มีประโยชน์ในกรณีของฉันที่อาจไม่ได้กำหนดตัวแปรสภาพแวดล้อม
Josh Peak

131

มีวัตถุคือ:

scala.util.Properties

นี่เป็นชุดของวิธีการที่สามารถใช้เพื่อรับข้อมูลสภาพแวดล้อมรวมถึง

scala.util.Properties.envOrElse("HOME", "/myhome" )

3
ฉันต้องการอสังหาริมทรัพย์ด้วย อนุญาตให้เรียกใช้ Optionals และมีชื่อสำหรับคุณสมบัติที่ใช้กันทั่วไป
ppopoff

25

วิธีการเดียวกัน:

scala> System.getenv("HOME")
res0: java.lang.String = /Users/dhg

ตอนนี้ฉันใช้ Scala ทุกวันฉันต้องย้ายคำตอบที่ยอมรับไปยังคำตอบของ @ paradigmatic มันใช้ Scala API และถ้าใช้ตามที่แนะนำในความคิดเห็นสามารถส่งคืนตัวเลือก
summerbulb

11

ใช้โดยตรงเริ่มต้นที่มีgetOrElseมากกว่าsys.envแผนที่ ( val myenv: Map[String, String] = sys.env):

sys.env.getOrElse(envVariable, defaultValue)

คุณจะได้รับเนื้อหาของหรือหากมันไม่ได้อยู่ที่envVariabledefaultValue


5

หากใช้ไลบรารีการกำหนดค่าของ Lightbend (โดยค่าเริ่มต้นใน Play2 และ Akka) คุณสามารถใช้งานได้

foo = "default value" foo = ${?VAR_NAME}

ไวยากรณ์เพื่อแทนที่ foo หากมีตัวแปรสภาพแวดล้อม VAR_NAME อยู่ รายละเอียดเพิ่มเติมในhttps://github.com/typesafehub/config#optional-system-or-env-variable-overrides


0

หากต้องการพิมพ์ตัวแปรสภาพแวดล้อมทั้งหมดคุณสามารถใช้

System.getenv.forEach((name, value) => println(s"$name: $value"))

1
error: missing parameter typeบน args หากคุณเพิ่งคัดลอกวางนี้
thundergolfer

@thundergolfer: ขณะนี้ฉันไม่มี Scala ติดตั้งอยู่ในเครื่อง คุณเข้าใจหรือไม่ว่ามีอะไรหายไป?
Matthias Braun

หลังจากเปลี่ยนพารามิเตอร์เพื่อฉันได้รับ(name: String, value: String) error: type mismatch; found : (String, String) => Unit required: java.util.function.BiConsumer[_ >: String, _ >: String]
Roland Weber

1
นี่คือสิ่งที่ใช้งานได้ แต่ต้องมีการนำเข้า: alvinalexander.com/scala/…
Roland Weber
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.