11

Bạn sử dụng gói nào để xử lý các tùy chọn dòng lệnh, cài đặt và tệp cấu hình?Làm cách nào để bạn xử lý các tùy chọn dòng lệnh và tệp cấu hình?

Tôi đang tìm kiếm thứ gì đó đọc tùy chọn do người dùng xác định từ dòng lệnh và/hoặc từ tệp cấu hình.

Tùy chọn (cài đặt) sẽ được chia thành các nhóm khác nhau, để tôi có thể chuyển các tùy chọn khác nhau (tập hợp con) cho các đối tượng khác nhau trong mã của tôi.

Tôi biết về boost::program_options, nhưng tôi không thể quen với API. Có lựa chọn thay thế trọng lượng nhẹ không?

(BTW, bạn có bao giờ sử dụng một cài đặt global đối tượng trong mã của bạn có thể được đọc từ bất cứ nơi nào? Hoặc bạn sẽ xem xét ác đó?)

Trả lời

5

Vâng, bạn sẽ không thích câu trả lời của tôi. Tôi sử dụng boost::program_options. Giao diện có một số nhận được sử dụng để, nhưng một khi bạn có nó xuống, nó là tuyệt vời. Chỉ cần chắc chắn để làm boatloads của đơn vị thử nghiệm, bởi vì nếu bạn nhận được cú pháp sai bạn sẽ nhận được lỗi thời gian chạy.

Và, vâng, tôi lưu trữ chúng trong một đối tượng đơn lẻ (chỉ đọc). Tôi không nghĩ đó là điều xấu xa trong trường hợp đó. Đó là một trong vài trường hợp tôi có thể nghĩ về nơi một singleton được chấp nhận.

+1

+1 cho tăng :: program_options, nhưng chỉ! Tôi sẽ cẩn thận với việc sử dụng các tùy chọn chương trình như một singleton. Chúng tôi đã bị cắn bằng cách thực hiện việc này vì chúng tôi cần thêm các tùy chọn khác nhau cho các tệp khác nhau. Đầu tiên chúng ta cần phải quay trở lại và loại bỏ singleton để chúng ta có thể lưu trữ các bộ tùy chọn khác nhau cho từng tệp riêng lẻ. –

+0

Điểm tốt, Richard. Tôi sử dụng boost :: program_options cho một trò chơi, và rõ ràng 1 bộ tùy chọn là đủ cho mỗi quá trình, nhưng cho các mục đích khác nhau, đây sẽ là một ý tưởng tồi. – rlbond

+0

Bạn vẫn ủng hộ tăng cường :: program_options? Dường như nó không còn được phát triển nữa (trang web tài liệu được sửa đổi lần cuối năm 2004). Nó có sử dụng/tương thích với C++ 11 không? Khi đọc giữa các dòng bài viết của bạn, nó thực sự không phải là một khuyến nghị tốt cả: * Chỉ cần chắc chắn để làm boatloads của đơn vị kiểm tra, bởi vì nếu bạn nhận được cú pháp sai, bạn sẽ nhận được lỗi thời gian chạy * là một lá cờ đỏ lớn! – Walter

-4

Hãy thử Apache Ant. Việc sử dụng chính của nó là các dự án Java, nhưng không có bất kỳ thứ gì về Java và nó có thể sử dụng được cho hầu hết mọi thứ.

Cách sử dụng khá đơn giản và bạn cũng có nhiều hỗ trợ cộng đồng. Nó thực sự tốt trong việc làm những điều theo cách bạn đang yêu cầu.

Đối với các tùy chọn toàn cầu trong mã, tôi nghĩ chúng rất cần thiết và hữu ích. Tuy nhiên, đừng lạm dụng chúng.

+3

Uuh, Apache Ant? Công cụ xây dựng? Nó có liên quan gì đến việc đọc các tùy chọn dòng lệnh trong C++? – Frank

+0

Bạn có thể giữ một tập tin cấu hình cơ bản cho C++, nhưng tất cả công việc thực tế có thể được thực hiện với Ant. Xem http://www.codemesh.com/products/junction/doc/ant_cpp.html hoặc chỉ http://www.google.com/search?hl=vi&site=&q=using+ant+c%2B%2B&btnG= Tìm kiếm –

0

Không chắc chắn về phân tích đối số dòng lệnh. Tôi không cần những khả năng rất phong phú trong khu vực đó và nói chung đã tự mình cuộn lại để tiết kiệm thêm nhiều phụ thuộc vào phần mềm của mình. Tùy thuộc vào nhu cầu của bạn là gì bạn có thể hoặc không muốn thử tuyến đường này. Các chương trình C++ tôi đã viết thường không được gọi từ dòng lệnh.

Mặt khác, đối với tệp cấu hình bạn thực sự không thể đánh bại định dạng dựa trên XML. Nó có thể đọc được, có thể mở rộng, có cấu trúc, v.v ... :) Thêm vào đó có rất nhiều trình phân tích cú pháp XML. Mặc dù thực tế nó là một thư viện C, tôi có xu hướng sử dụng libxml2 từ xmlsoft.org.

+0

Kiểm tra [pugixml.org] (http://pugixml.org) để biết các trình phân tích cú pháp XML nhanh được viết bằng C++. Là tiền thưởng, nó hỗ trợ 'XPath' và cũng chỉ là tiêu đề! – Sean

3

Nếu Tăng quá mức cần thiết cho bạn, GNU Gengetopt có lẽ cũng vậy, nhưng IMHO, đó là một công cụ thú vị để gây rối xung quanh.

Và, tôi cố gắng tránh xa các đối tượng tùy chọn toàn cầu, tôi muốn mỗi lớp đọc cấu hình của riêng nó. Bên cạnh triết lý "Toàn cầu là tà ác", nó có xu hướng trở thành một mớ hỗn độn ngày càng tăng để có tất cả cấu hình của bạn ở một nơi, và cũng khó để nói những biến cấu hình nào đang được sử dụng ở đâu. Nếu bạn giữ cấu hình gần hơn với nơi nó đang được sử dụng, nó rõ ràng hơn những gì mỗi một là cho, và dễ dàng hơn để giữ sạch sẽ.

(Như những gì tôi sử dụng, cá nhân tôi, cho tất cả mọi thứ gần đây nó được một thư viện dòng lệnh phân tích độc quyền mà người khác tại công ty của tôi đã viết, nhưng điều đó không giúp bạn nhiều, không may)

1

GNU getopt khá đẹp. Nếu bạn muốn có cảm giác C++, hãy xem xét getoptpp là một trình bao bọc xung quanh getopt gốc. Theo như tập tin cấu hình có liên quan, bạn nên cố gắng làm cho nó càng ngu càng tốt để phân tích dễ dàng. Nếu bạn có chút quan tâm, bạn có thể muốn sử dụng yaac & lex nhưng điều đó sẽ thực sự là một đô la lớn cho các ứng dụng nhỏ.

Tôi cũng muốn đề xuất rằng bạn nên hỗ trợ cả tệp cấu hình và tùy chọn dòng lệnh trong ứng dụng của bạn. Các tệp cấu hình tốt hơn cho các tùy chọn đó sẽ được thay đổi ít thường xuyên hơn. Các tùy chọn dòng lệnh rất tốt khi bạn muốn chuyển các đối số thay đổi ngay lập tức (thường là khi bạn đang tạo một ứng dụng, một chương trình khác sẽ được gọi.)

11

Tại Google, chúng tôi sử dụng gflags. Nó không làm các tập tin cấu hình, nhưng đối với cờ, nó ít đau hơn rất nhiều so với việc sử dụng getopt.

#include <gflags/gflags.h> 
DEFINE_string(server, "foo", "What server to connect to"); 
int main(int argc, char* argv[]) { 
    google::ParseCommandLineFlags(&argc, &argv, true); 
    if (!server.empty()) { 
     Connect(server); 
    } 
} 

Bạn đặt DEFINE_foo ở đầu tệp cần biết giá trị của cờ. Nếu các tệp khác cũng cần phải biết giá trị, bạn sử dụng DECLARE_foo trong chúng. Ngoài ra còn có hỗ trợ khá tốt để thử nghiệm, do đó, các xét nghiệm đơn vị có thể thiết lập cờ khác nhau một cách độc lập.

+0

Tôi thích! Có vẻ rất dễ sử dụng. – Milan

1

Nếu bạn đang làm việc với Visual Studio 2005 trên x86 và x64 Windows có một số tiện ích Phân tích cú pháp dòng lệnh tốt trong SimpleLibPlus library. Tôi đã sử dụng nó và thấy nó rất hữu ích.

3

Tôi đã sử dụng TCLAP cho một hoặc hai năm nay, nhưng ngẫu nhiên tôi stumbled trên ezOptionParser. ezOptionParser không bị "hội chứng phức tạp" này cũng giống như cách mà các trình phân tích cú pháp tùy chọn khác thực hiện.

Tôi khá ấn tượng cho đến nay và tôi có thể sẽ sử dụng nó trong tương lai, đặc biệt vì nó hỗ trợ tệp cấu hình. TCLAP là một thư viện phức tạp hơn, nhưng tính đơn giản và các tính năng bổ sung từ ezOptionParser là rất hấp dẫn.

bổng lộc khác từ trang web của mình bao gồm (tính đến 0.2.0):

  • Khá in đầu vào phân tích cú pháp để gỡ lỗi.
  • Tạo thông báo sử dụng tự động trong ba bố cục (căn chỉnh, xen kẽ hoặc so le).
  • Triển khai tệp tiêu đề duy nhất.
  • Chỉ phụ thuộc vào STL.
  • Tên tùy chọn ngắn và dài tùy ý (dấu gạch ngang '-' hoặc cộng '+' tiền tố không bắt buộc).
  • Dấu phân cách danh sách đối số tùy ý.
  • Nhiều trường hợp cờ được phép.
  • Xác thực các tùy chọn bắt buộc, số đối số dự kiến ​​cho mỗi cờ, phạm vi dữ liệu, phạm vi do người dùng xác định, thành viên trong danh sách và trường hợp cho danh sách chuỗi.
  • Tiêu chí xác thực có thể xác định bằng chuỗi hoặc hằng số.
  • Nhập nhiều tệp cùng với nhận xét.
  • Xuất sang tệp, đặt tùy chọn hoặc tất cả các tùy chọn bao gồm mặc định khi khả dụng.
  • Chỉ mục phân tích cú pháp tùy chọn cho ngữ cảnh phụ thuộc vào đơn đặt hàng.
+0

Tôi biết đây là một chủ đề rất cũ, nhưng chỉ để tránh bất cứ ai khác rơi vào cùng một cái bẫy như tôi đã làm, sau khi đọc chủ đề này. ezOptionParser hoạt động tốt cho các tùy chọn phân tích cú pháp thực sự, nhưng nó có một lỗi nghiêm trọng làm hỏng ứng dụng của bạn nếu bạn sử dụng hàm getUsage() để báo cáo các tùy chọn dòng lệnh. Thư viện không được tác giả hỗ trợ ngay bây giờ, vì vậy lỗi này sẽ không bao giờ được khắc phục. Sử dụng hết sức thận trọng; hoặc tốt hơn, sử dụng cái gì khác. – Graham

Các vấn đề liên quan