cuốn sách gpt4 ai đã làm

ruby - 如何为用 Ruby 编写的 Ruby 命令行实用程序提供配置文件?

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-03 16:05:55 27 4
mua khóa gpt4 Nike

我有一个使用 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ọcend ở 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ọcend 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?

câu trả lời hay nhất

Để đá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.

Giới thiệu về Ruby - Làm cách nào để cung cấp tệp cấu hình cho tiện ích dòng lệnh Ruby được viết bằng Ruby? , chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/14011690/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress