Cách tốt nhất để lưu cài đặt ứng dụng


17

Trong Windows cách mặc định là registry. Điều này cho phép bạn phân biệt các cài đặt trên toàn hệ thống và theo người dùng.

Trong Unix, bạn nên sử dụng các tệp văn bản trong thư mục / etc cho cài đặt toàn hệ thống (quy ước cho cài đặt theo người dùng là gì?).

Nhiều chương trình mới (và đặc biệt là các chương trình được thiết kế để có thể mang theo) sử dụng các tệp XML.

  • Cách tốt nhất (và vị trí) để lưu trữ các cài đặt không phải BLOB là gì?
  • Chúng ta nên theo từng hệ thống mặc định hoặc có một giải pháp thống nhất?
  • Và cách di động tốt nhất là gì?

Xin hãy thật cụ thể về những gì bạn muốn nói với "tốt nhất".

3
@ Thorbjørn: điều chỉnh tốt nhất \ ˈbest \ superlative of good
Wizard79

3
bạn sẽ ngạc nhiên về sự đa dạng về ý nghĩa của "tốt nhất" trên các trang web StackExchange.

Câu trả lời:


23

Cách tốt nhất (và vị trí) để lưu trữ các cài đặt không phải BLOB là gì?

Trên Windows, có vẻ chấp nhận được việc sử dụng sổ đăng ký. Theo tôi, sổ đăng ký là một hệ thống kém phát triển, và thay vào đó, một tệp văn bản đơn giản trong Users\Username\AppDatathư mục nên được ưu tiên. Điều này dễ sao lưu hơn, ít nguy hiểm hơn cho người dùng sửa đổi và dễ dàng dọn dẹp hơn.

Trên Linux và hầu hết các Unix, Vị trí ưa thích là /home/user/.config/appnamedành cho cài đặt dành riêng cho người dùng và /etc/cho cài đặt toàn cầu (toàn hệ thống). Vị trí ít được ưu tiên (nhưng có thể chấp nhận) cho cài đặt người dùng là ~/.appname, nhưng điều này thường không được ưa chuộng. Các tệp này phải được người dùng chỉnh sửa, vì vậy định dạng có thể đọc được của con người luôn được ưu tiên.

Tôi không đồng ý với hầu hết mọi người rằng XML là một định dạng có thể chấp nhận để lưu trữ dữ liệu không phải là blob. Theo tôi, đó là một định dạng quá phức tạp và quá phức tạp cho những gì thường kết thúc là những mẩu dữ liệu có cấu trúc rất nhỏ. Tôi thích xem các tệp trong các cặp YAML, JSON, ASN.1, name = value hoặc các định dạng tương tự. Có quá nhiều cú pháp làm cho người dùng quá dễ dàng làm rối và để tệp ở định dạng không hợp lệ.

Chúng ta nên theo từng hệ thống mặc định hoặc có một giải pháp thống nhất?

Điều đó hoàn toàn phụ thuộc vào bạn, nhưng hãy ghi nhớ một số điều:

  • Các nền tảng như * nix có những hạn chế nghiêm ngặt về vị trí có thể ghi. Nghiêm khắc hơn Windows. Vì thế:
    • Nơi duy nhất bạn nên viết cho bất cứ điều gì là trong thư mục nhà của người dùng.
    • Trừ khi ứng dụng của bạn là một dịch vụ hệ thống; trong trường hợp đó, tất cả các tệp dữ liệu có thể thay đổi sẽ được ghi vào /var/. Các tệp dữ liệu không thể thay đổi phải được giữ trong thư mục ứng dụng của bạn trong /usr/share/hoặc /usr/local/share/hoặc/opt/
    • File cấu hình trong /etc/nên không bao giờ được ghi vào bằng ứng dụng khi nó đang chạy, thậm chí nếu nó có ghi truy cập vào chúng. /etc/nên là kho lưu trữ cho các hành vi mặc định và không có gì khác.
    • Kế hoạch ứng dụng của bạn phải được cài đặt theo một trong ba nơi: /usr/local/, /opt/appname, hoặc /home/username/appname.
    • Blobs nên được lưu trữ cùng với các tệp cấu hình khác nếu chúng được thay đổi. Đó là nói chung thích hợp hơn để sử dụng một định dạng người dùng có thể chỉnh sửa, vì vậy cái gì đó như SQLite hoặc Berkeley DB được ưa thích (kể từ khi có các công cụ dòng lệnh cho mỗi), nhưng không cần thiết.
  • Trên Windows, các ứng dụng của bạn chỉ nên ghi vào thư mục Người dùng. Vị trí chuẩn hóa cho các tệp dữ liệu là Users\User\AppData. Không nơi nào khác có vẻ chấp nhận được.
  • Trên Mac OS X, các cài đặt ứng dụng của bạn sẽ được lưu trữ ~/Library/Preferencescùng với tất cả các tệp nguyên bản của các ứng dụng khác. plistdường như là định dạng ưa thích, nhưng bạn sẽ muốn kiểm tra kỹ các nguyên tắc của Apple.

Và cách di động tốt nhất là gì?

Không có "tốt nhất", phải trung thực. Chỉ có những hạn chế và kỳ vọng cụ thể về nền tảng. Đề nghị của tôi là gắn bó với các phương tiện dành riêng cho nền tảng, ngay cả khi nó có nghĩa là viết thêm mã.


1
Tôi nghĩ rằng Microsoft đã không khuyến khích việc sử dụng registry trong một vài năm nay - điều này là tốt. Viết thư cho AppData, như bạn đã đề cập, là cách để đi. Trong .NET (cũng có thể trong API Windows?) Thậm chí còn có một phương thức trả về đúng đường dẫn.
MetalMikester

Ngoài ra còn có một biến môi trường:%APPDATA%
greyfade

@MetalMikester - vâng, hoàn toàn đúng chỗ. AppData cũng được hỗ trợ bởi Roaming Profile cho môi trường miền.
JBRWilkinson

cài đặt! = config
Yousha Aleayoub 8/12/18

> In my opinion, the registry was a poorly-devised system, and instead a simple text file in the Users\Username\AppData directory should be preferred. @greyfade - Nhà phát triển API Windows lâu năm, Raymond Chen, giải quyết vấn đề này và giải thích lý do tại sao sử dụng tệp văn bản qua sổ đăng ký không phải là mẫu thiết kế tốt hơn: Tại sao các tệp INI không được dùng cho đăng ký
Mick

8

Trong Windows, sử dụng %APPDATA%\appname. Trong * NIX, sử dụng ~/.appname. Không sử dụng tên thư mục cố định trong một trong hai nền tảng, vì thư mục chính của người dùng có thể khác với mặc định (ví dụ: nó có thể nằm trên mạng).

Đối với định dạng, sử dụng bất cứ điều gì bạn nghĩ là tốt nhất. Đó là một quyết định mà chỉ bạn mới có thể đưa ra trong bối cảnh ứng dụng của mình. Thật không cần thiết, và thực sự, không thể tránh khỏi, để có một cách làm "tiêu chuẩn", nếu cách "tiêu chuẩn" đó không phải là điều tốt nhất cho chương trình cụ thể của bạn.

Ví dụ: XML / JSON có thể là một cách tốt để lưu trữ dữ liệu / cấu hình người dùng nếu ứng dụng của bạn đã sử dụng XML / JSON cho mục đích khác. Nhưng nếu đó là một tệp cấu hình đơn giản, tại sao lại thêm sự phình to vào ứng dụng của bạn bằng cách giới thiệu một phụ thuộc? Trong trường hợp đó, tốt nhất là chỉ sử dụng một tệp văn bản đơn giản với var: value\ncác dòng thay thế.

EDIT: Không có cách di động "tốt nhất", vì các hệ điều hành sử dụng các quy ước rất khác nhau cho việc này. Đừng phá vỡ các tiêu chuẩn hệ điều hành mà không có lý do chính đáng.

EDIT2: Nếu bạn thấy mình thực hiện cài đặt toàn hệ thống trong /etchoặc HKEY_LOCAL_MACHINE, hãy tự hỏi liệu cài đặt đó có thực sự toàn cầu không. Sau đó đợi 5 phút và tự hỏi lại. Nếu câu trả lời vẫn là có, thì bằng mọi cách, hãy tạo một thiết lập toàn cầu. Hãy nhớ rằng, một người dùng bình thường không có quyền truy cập bằng văn bản /etchoặc HKEY_LOCAL_MACHINEbằng cách này, bạn đảm bảo rằng ai đó không có quyền quản trị không thể cài đặt ứng dụng của bạn.


Đoạn đầu tiên cho phép một người sử dụng Path.Combine hoặc một cái gì đó tương tự và do đó đặt vị trí gốc tương đối một lần thành% APPDATA% hoặc ~ và để mã làm phần còn lại, đối với EDIT2 thực sự không tồn tại một giải pháp đa nền tảng mà tôi biết của. Có thể có những người đã viết thư viện cấu hình đa nền tảng cho mục đích đó, ít nhất đó sẽ là một ý tưởng hay ...
Tamara Wijsman

1
@TomWij: Chắc chắn bất kỳ nhà phát triển có thẩm quyền nào cũng có thể nhận ra rằng bạn không cần phải sử dụng chữ ở mọi nơi;). Đó là những gì các biến là cho.
Chinmay Kanchi

1
~/.config/applicatonđang ngày càng trở thành địa điểm ưa thích trên * nix.
greyfade

@greyfade: Tôi chưa bao giờ thực sự nhận ra điều này, nhưng bạn đã đúng. Trên máy của tôi, khoảng một phần tư các ứng dụng lưu trữ dữ liệu cấu hình ~để thực hiện ~/.config/appname.
Chinmay Kanchi

Toàn bộ ứng dụng sử dụng ~ / .appname trong Windows (tương đương với thư mục hồ sơ người dùng của bạn, KHÔNG phải tài liệu) và điều đó rất khó chịu. Những thư mục đó không tự ẩn đi!
Alan Pearce

3

Tôi cố gắng và tránh ra khỏi sổ đăng ký, đó là cách sử dụng. Tôi ước mọi người sẽ.

Tôi thích giữ các tệp cấu hình xml hoặc tệp bin hoặc đôi khi là cơ sở dữ liệu cục bộ (SQLite).


+1 để tránh đăng ký. Bây giờ tôi không thể tìm thấy nó, nhưng dường như tôi nhớ rằng đã đọc rằng ai đó ở MS đã thừa nhận rằng đăng ký là một sai lầm.
Chinmay Kanchi

1
Đồng ý với bạn ngoại trừ phần XML. Tôi sẽ sử dụng ini (hoặc tệp văn bản đơn giản) cho yêu cầu cài đặt đơn giản và SQLite cho các ứng dụng phức tạp.
Codism

Bây giờ họ đang thừa nhận điều đó? Tôi có thể nói với bạn rằng trở lại vào năm 1995! Mac OS Classic đã hiểu đúng: Thư mục Tùy chọn cung cấp cho bạn một nơi tập trung để lưu trữ thông tin cấu hình, với mỗi ứng dụng lưu vào tệp riêng của nó. Khi tôi lần đầu tiên nhìn thấy Sổ đăng ký, tôi đã nghĩ, "Microsoft có bao giờ nghe nói về việc không bỏ tất cả trứng vào một giỏ không?!?"
Mason Wheeler

1
Tôi nghĩ là một nơi để đặt các cài đặt hệ điều hành (như đăng ký mở rộng tệp, v.v.), thật tốt. Nhưng nếu Microsoft xuất bản nó dưới dạng api chỉ đọc, có lẽ họ đã bị kiện vì nó và phải làm cho nó có thể ghi được.
TiếtBio

@Chinmay, @Mason, đăng ký KHÔNG phải là một lỗi vì đăng ký không FAR hơn là chỉ lưu trữ dữ liệu cấu hình (xem: chính sách nhóm, tên miền, sao chép). Sai lầm là cách Microsoft giới thiệu nó cho các nhà phát triển và thiếu bất kỳ tiêu chuẩn tốt nào về cách sử dụng nó. Nó kết thúc như một bãi rác cho dữ liệu ứng dụng, đó không phải là ý nghĩa của nó.
Matt Olenik

3

Câu trả lời của tôi là một sự kết hợp của Chinmay Kanchi của câu trả lời và BioBuckyBall của câu trả lời .

XML / Json cho các cấu hình đơn giản, SQLite cho các cấu hình phức tạp, lớn hơn được đặt trên thư mục ứng dụng mặc định của hệ điều hành hoặc thư mục người dùng mặc định của hệ điều hành khi các cấu hình phụ thuộc vào người dùng. Cả hai có thể được sử dụng.


2

Trong Windows, tôi sẽ giữ cài đặt ứng dụng trong AppDatathư mục


1

Cài đặt người dùng thường ở

/home/<user>/.<application> 

Vì vậy, ví dụ cho các cài đặt irssi là /home//.irssi/config


Nhưng đây là một quy ước Unix. Còn Windows thì sao? Và trong Linux, không tràn ngập thư mục nhà của người dùng với thư mục con? Tại sao không /home/<user>/etc/application?
Wizard79

@Lorenzo: Làm ngập thư mục nhà của người dùng hiếm khi là một vấn đề.
Chinmay Kanchi

1
Cài đặt cấu hình ngày càng được di chuyển ~/.config/applicationđể giúp mọi thứ được hợp nhất. Tôi có khuynh hướng đồng ý với phong trào này.
greyfade

1
@Lorenzo: Điều này giống hệt như quy ước của Windows về lưu trữ các tệp cấu hình trong AppData.
greyfade

1
@Chris: không đời nào! :-)
Wizard79

1

Tôi nghĩ tốt nhất nên sử dụng cơ chế dành riêng cho nền tảng. Ví dụ: trên OS X, cơ chế ưu tiên là đặt danh sách thuộc tính trong ~ / Library / Preferences và API API có giao diện thực sự đơn giản để lưu trữ và truy xuất các cài đặt từ đó.

Nếu ứng dụng của bạn là đa nền tảng, bạn có thể trừu tượng hóa điều này với một lớp hoặc không có gì.


0

Điều duy nhất tôi viết cho cơ quan đăng ký là vị trí của ứng dụng, để người cài đặt và người cập nhật có thể tìm thấy nó dễ dàng. Mọi thứ khác được lưu trữ trong các tệp trong / AppData / Company / App


-2

Đối với các ứng dụng Java tôi nghĩ gson là một lựa chọn tốt. Tạo các đối tượng cài đặt của bạn và sử dụng gson để chuyển đổi chúng thành JSON và ngược lại. Có lợi thế là con người có thể đọc được thay vì một số blob nối tiếp.

Chỉnh sửa: ok, vì vậy nó có thể không quá chung chung ...


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.