ไฟล์ .env เก็บตัวแปรสภาพแวดล้อมในรูปแบบคีย์-ค่าที่ง่ายและแยกการกำหนดค่าออกจากซอร์สโค้ดของแอปพลิเคชัน ตาม The Twelve-Factor App (2011) การกำหนดค่าจะต้องแยกออกจากโค้ดอย่างเคร่งครัด และไฟล์ .env ได้กลายเป็นมาตรฐานของแนวทางนี้ .env File ช่วยให้ใส่ค่า API คีย์, URL เซิร์ฟเวอร์ และแฟล็กบิลด์ที่แตกต่างกันโดยไม่ต้องคอมไพล์โปรเจกต์ใหม่
ประเด็นสำคัญ
.env File คือไฟล์กำหนดค่าที่เก็บตัวแปรสภาพแวดล้อมในรูปแบบข้อความง่ายๆ KEY=VALUE แต่ละบรรทัดประกอบด้วยตัวแปรหนึ่งตัว: ชื่อคีย์และค่าของมัน คั่นด้วยเครื่องหมายเท่ากับ
ไฟล์ .env แก้ปัญหาพื้นฐานของการพัฒนาสมัยใหม่: สภาพแวดล้อมที่แตกต่างกัน (ท้องถิ่น, ทดสอบ, ผลิตจริง) ต้องการการตั้งค่าที่แตกต่างกันโดยสิ้นเชิง URL ของเซิร์ฟเวอร์ API บนเครื่องท้องถิ่นคือ http://localhost:8080 บนเซิร์ฟเวอร์ผลิตจริงคือ https://api.production.com หากค่าเหล่านี้ถูกฮาร์ดโค้ดลงในโค้ดแอปพลิเคชันโดยตรง แต่ละบิลด์สำหรับสภาพแวดล้อมที่แตกต่างกันจำเป็นต้อง เปลี่ยนแปลงซอร์สโค้ด
แนวปฏิบัติในการเก็บการกำหนดค่านอกโค้ดหลักของแอปพลิเคชันถูกทำให้เป็นมาตรฐานในแถลงการณ์ The Twelve-Factor App (2011) ซึ่งระบุว่าตัวแปรสภาพแวดล้อมเป็นวิธีที่ถูกต้องเท่านั้นในการกำหนดค่าแอปพลิเคชัน ตามการสำรวจของ JetBrains Developer Ecosystem (2024) นักพัฒนาแอปมือถือมากกว่า 67% ใช้ไฟล์ .env ในโปรเจกต์ของพวกเขา
สำหรับการพัฒนาแอปมือถือ .env ให้ข้อได้เปรียบเพิ่มเติม: ค่าจะถูกแทนที่ในขั้นตอน บิลด์ ผ่าน Gradle (Android) หรือ xcconfig (iOS) ทำให้สามารถสร้างบิลด์แยกสำหรับการพัฒนา การทดสอบ และการผลิตโดยไม่ต้องเปลี่ยนซอร์สโค้ด
.env มีประโยชน์อย่างยิ่งเมื่อทำงานเป็นทีม: นักพัฒนาแต่ละคนสร้าง .env ท้องถิ่นของตนเองพร้อมการตั้งค่าสำหรับสภาพแวดล้อมของตน (เส้นทาง DB ท้องถิ่น, คีย์ API สำหรับดีบัก) ในขณะที่การตั้งค่าร่วมกันถูกกำหนดใน .env.example ในที่เก็บ สิ่งนี้ขจัดสถานการณ์ที่หลังจาก git pull บิลด์ของนักพัฒนาพังเนื่องจากไม่มีตัวแปรสภาพแวดล้อมที่พวกเขาไม่รู้จัก สมาชิกทีมใหม่เพียงคัดลอก .env.example เป็น .env และกรอกค่าท้องถิ่นของตน
รูปแบบ .env ง่ายมาก: แต่ละบรรทัดคือตัวแปรหนึ่งตัวในรูปแบบ KEY=VALUE โดยปกติช่องว่างรอบเครื่องหมายเท่ากับจะถูกละเว้น แต่ในไลบรารีส่วนใหญ่จะถือว่าเป็นส่วนหนึ่งของค่า ดังนั้นจึงควรหลีกเลี่ยง
ความคิดเห็นเริ่มต้นด้วยอักขระ # — ทั้งบรรทัดหลังจากนั้นจะถูกละเว้น บรรทัดว่างก็ถูกข้ามไปเช่นกัน หากค่ามีช่องว่าง จะถูกใส่ในเครื่องหมายคำพูดคู่หรือเดี่ยว
# การตั้งค่าสภาพแวดล้อมพื้นฐาน
APP_NAME=MyMobileApp
APP_ENV=development
# การกำหนดค่า API
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# ข้อมูลที่ละเอียดอ่อน
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
ตัวแปรทั้งหมดใน .env เป็นสตริง แต่ไลบรารีโหลดเดอร์สามารถแปลงเป็นประเภทที่ต้องการได้ การ escape อักขระพิเศษใช้ แบ็กสแลช และเครื่องหมายคำพูด หากค่ามีอักขระ # เป็นส่วนหนึ่งของข้อความ จะต้อง escape เป็น \#
KEY=value หรือ KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}เมื่อโหลด .env ไลบรารีอาจทำ การแทรกตัวแปร — แทนที่ค่าของคีย์หนึ่งภายในอีกคีย์หนึ่ง ตัวอย่างเช่น ตัวแปร DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db จะขยาย DB_USER และ DB_PASS จากไฟล์เดียวกัน
วิธีการเชื่อมต่อ .env ขึ้นอยู่กับแพลตฟอร์ม Android ใช้ปลั๊กอิน Gradle, iOS — ไฟล์กำหนดค่า xcconfig และโซลูชันข้ามแพลตฟอร์มอย่าง Flutter — ไลบรารีเฉพาะทาง
บน Android .env จะถูกโหลดผ่านปลั๊กอิน gradle-dotenv ปลั๊กอินอ่าน .env จากรูทของโปรเจกต์และเพิ่มค่าไปยัง BuildConfig หลังจากนั้นจะพร้อมใช้งานในโค้ด Kotlin หรือ Java ผ่านฟิลด์ที่สร้างขึ้น
// build.gradle.kts (ระดับแอป)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// การเข้าถึงในโค้ด: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
บน iOS ตัวแปรสภาพแวดล้อมมักจะถูกกำหนดค่าผ่านไฟล์ xcconfig ในการโหลด .env ใน Swift จะใช้ไลบรารี DotEnv หรือกลไก Info.plist ในตัวที่มีคีย์แบบกำหนดเอง
// การโหลด .env ในโปรเจกต์ Swift
import DotEnv
struct AppConfig {
static func load() {
let env = DotEnv(Bundle.main)
env.load()
let apiURL = ProcessInfo.processInfo
.environment["API_BASE_URL"] ??
"https://default.api.com"
}
}
สำหรับ Flutter มีแพ็คเกจ flutter_dotenv ซึ่งโหลดตัวแปรจาก .env ระหว่างการเริ่มต้นแอปพลิเคชัน ไฟล์ .env วางอยู่ในรูทของโปรเจกต์ และตัวแปรพร้อมใช้งานผ่านคลาส dotenv
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — โหลดเมื่อเริ่มต้น
import 'package:flutter_dotenv/flutter_dotenv.dart';
void main() async {
await dotenv.load(fileName: '.env');
var apiUrl = dotenv.get('API_BASE_URL');
runApp(MyApp(baseUrl: apiUrl));
}
ทั้งสามวิธีการใช้หลักการร่วมกัน: .env จะถูกโหลด ในขั้นตอนบิลด์ หรือเมื่อแอปพลิเคชันเริ่มต้น ค่าจะถูกแคชและใช้ในโค้ดผ่านค่าคงที่ที่สร้างขึ้น สิ่งนี้ป้องกันข้อมูลที่ละเอียดอ่อนไม่ให้เข้าไปในที่เก็บ
สำหรับ React Native ใช้แพ็คเกจ react-native-config ซึ่งในขั้นตอนบิลด์จะสร้างคลาส BuildConfig สำหรับ Android และค่าคงที่ใน Info.plist สำหรับ iOS โดยอัตโนมัติจากไฟล์ .env เดียวในรูทของโปรเจกต์ สะดวกเป็นพิเศษสำหรับสตาร์ทอัพที่ใช้ Expo หรือ bare workflow: ไฟล์ .env เดียวที่ระดับรูทเพียงพอสำหรับทุกแพลตฟอร์มที่จะได้รับตัวแปรสภาพแวดล้อมเดียวกันโดยไม่ต้องทำซ้ำการกำหนดค่า
แม้จะมีข้อดีทั้งหมด .env ไม่ใช่โซลูชันที่สมบูรณ์สำหรับเก็บความลับในสภาพแวดล้อมการผลิต มันให้การป้องกันระดับพื้นฐาน แต่หากใช้ไม่ถูกต้อง อาจนำไปสู่ การรั่วไหลของข้อมูลที่เป็นความลับ
กฎที่สำคัญที่สุด — .env ไม่ควรเข้าไปในระบบควบคุมเวอร์ชันของที่เก็บ ไฟล์จะถูกเพิ่มใน .gitignore ทันทีหลังจากสร้าง และเฉพาะไฟล์ตัวอย่าง .env.example ที่มีค่าว่างหรือปลอมเท่านั้นที่ถูกคอมมิตในที่เก็บ
# .env.example — คอมมิตในที่เก็บ
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — ห้ามระบุแม้ในตัวอย่าง!
# JWT_SECRET — ห้ามระบุแม้ในตัวอย่าง!
# .gitignore
# ไฟล์ Dotenv
.env
.env*.local
สำหรับโปรเจกต์ที่ใช้งานจริง แนะนำให้ใช้โซลูชันการจัดการความลับระดับมืออาชีพ .env ในการผลิต ยอมรับได้เฉพาะเมื่อไฟล์อยู่นอก document-root ของเซิร์ฟเวอร์และมีสิทธิ์การเข้าถึงที่เข้มงวด
ตาม Snyk State of Open Source Security (2024) การรั่วไหลของไฟล์ .env ผ่านที่เก็บเป็นสาเหตุของ 12% ของเหตุการณ์การเปิดเผยคีย์ API ทั้งหมดในหมู่บริษัทที่สำรวจ การใช้ตัวจัดการความลับโดยเฉพาะช่วยลดความเสี่ยงนี้เป็นศูนย์
การป้องกันเพิ่มเติมทำได้โดยการใช้ ฮุค pre-commit ด้วยเครื่องมืออย่าง husky และ lint-staged ซึ่งตรวจสอบว่านักพัฒนาได้เพิ่ม .env ในการคอมมิตโดยไม่ตั้งใจหรือไม่ เครื่องมืออย่าง git-secrets (AWS) และ talisman สแกนแต่ละคอมมิตเพื่อหารูปแบบของคีย์ API โทเค็น และรหัสผ่าน โดยบล็อกคอมมิตหากพบ สำหรับไปป์ไลน์ CI แนะนำให้เพิ่ม detect-secrets — สแกนเนอร์อัตโนมัติที่จะไม่ให้ไฟล์ .env เข้าไปในที่เก็บแม้ว่านักพัฒนาจะทำผิดพลาดก็ตาม
คำถามที่พบบ่อย
ไม่ .env ไม่ควรถูกคอมมิตใน Git ไฟล์มีข้อมูลที่ละเอียดอ่อนและควรเพิ่มใน .gitignore แทนที่ให้วาง .env.example พร้อมเทมเพลตของตัวแปรที่จำเป็นทั้งหมดในที่เก็บ
.env คือไฟล์จริงที่มีค่าการผลิตซึ่งไม่เคยถูกคอมมิต ไฟล์ .env.example มีคีย์เดียวกัน แต่มีค่าว่างหรือปลอม — มันถูกคอมมิตในที่เก็บเป็นตัวอย่างสำหรับนักพัฒนาใหม่
ได้ แต่ไม่แนะนำหากไม่มีการป้องกันเพิ่มเติม หากใช้ .env บนเซิร์ฟเวอร์การผลิต ไฟล์ควรอยู่ นอก document-root ของเว็บเซิร์ฟเวอร์โดยมีสิทธิ์การเข้าถึง 600 (เจ้าของเท่านั้น) สำหรับโปรเจกต์ที่สำคัญ ตัวจัดการความลับจะดีกว่า
ผ่านปลั๊กอิน gradle-dotenv (co.uzzu.dotenv) ปลั๊กอินอ่าน .env จากรูทของโปรเจกต์และส่งออกค่าไปยัง BuildConfig ตัวแปรพร้อมใช้งานในโค้ดเป็น BuildConfig.VARIABLE_NAME ในขั้นตอนการคอมไพล์
ใช่ parser จำนวนมากรองรับ การแทรก ในรูปแบบ ${VAR_NAME} ตัวอย่างเช่น URL=${HOST}:${PORT} จะแทนที่ค่าของ HOST และ PORT จากไฟล์เดียวกัน อย่างไรก็ตาม ความสามารถนี้ขึ้นอยู่กับไลบรารีโหลดเดอร์เฉพาะ
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม