我有一个使用 GLI
Khung này là một tiện ích dòng lệnh được viết bằng Ruby. Tôi muốn định cấu hình tiện ích dòng lệnh trong thư mục chính của mình, sử dụng chính Ruby làm DSL để xử lý nó (đại loại như đá quý
hoặc Tệp Rake
).
Tôi có lớp ConfigData trong thư mục lib/myapp. Lớp học trông giống như sau:
dữ liệu cấu hình lớp
@@dữ liệu = {}
lớpConfigItem
chắc chắn khởi tạo
@data = {}
end
def thiếu_method(name, *args)
@data[name] = args[0]
end
end
def self.add(phần)
mục = ConfigItem.new()
mục sản lượng
@@dữ liệu[phần]=mục
end
end
Bây giờ, thứ tôi muốn là một tệp cấu hình, tốt nhất nên đặt tên là Tệp ứng dụng của tôi
, nằm trong thư mục làm việc hiện tại, chứa nội dung sau
add('section1') làm |i|
i.param1 'Một số dữ liệu'
i.param2 'Thêm dữ liệu'
end
Khi mã này được đưa vào ConfigData lớp học
Và end
ở giữa, nó hoạt động tốt. Nhưng bây giờ tôi muốn đặt nó vào thư mục làm việc nơi tôi khởi chạy ứng dụng.
Tôi đã thử trong ConfigData lớp học
Và end
sử dụng require('./Myappfile') nhưng nó không hiệu quả với tôi. Tôi đã cố đọc mã nguồn của rake nhưng nó không rõ ràng lắm.
Bất kỳ lời khuyên làm thế nào để giải quyết vấn đề này?
Để đánh giá mã trong ngữ cảnh của một phiên bản, đó là điều bạn muốn làm, bạn cần instance_eval()
phương pháp. Không bao giờ sử dụng đánh giá bình thường. một lần. Dù sao, đây là cách bạn tải tệp Fingi và lấy dữ liệu:
config = ConfigData.new
config.instance_eval(File.read("Myconfig"))
#Truy cập dữ liệu cấu hình tại đây từ đối tượng cấu hình
Thật đơn giản. Sau khi tải đối tượng theo cách này, bạn có thể truy cập giá trị của đối tượng.
Cảnh báo: Điều này không an toàn lắm. Đây thực sự là một lỗ hổng bảo mật rất lớn. Đây là phiên bản an toàn:
f = Fiber.new {str = File.read("Myconfig"); $SAFE = 4; config = ConfigData.new;
confdata = f.sơ yếu lý lịch
#Truy cập dữ liệu cấu hình tại đây từ confdata.
Điều này thực thi mã bên ngoài trong một (loại) hộp cát, vì vậy nó không thể làm bất cứ điều gì khó chịu.
Ngoài ra, tại sao bạn không sử dụng cấu hình YAML? Trừ khi cấu hình yêu cầu chạy pwd
mã hoặc truy cập RUBY_VERSION, nếu không thì YAML đơn giản hơn, an toàn hơn và ít xảy ra lỗi hơn.
Tôi là một lập trình viên xuất sắc, rất giỏi!