2012-04-08 34 views
52

Tôi đã thấy (không nhớ ở đâu) một tập tin package.json với các phím tùy chỉnh bắt đầu với một dấu gạch dưới:Thêm siêu dữ liệu hoặc cấu hình tùy chỉnh vào package.json, nó có hợp lệ không?

{ 
    "name": "application-name" 
    , "version": "0.0.1" 
    , "private": true 
    , "dependencies": { 
     "express": "2.4.7" 
    , "jade": ">= 0.0.1" 
    } 
    , "_random": true 
} 

Bạn có được phép làm điều này? Nó vẫn còn hợp lệ? Nếu điều này được cho phép, có bất kỳ tài liệu nào về các quy tắc không?

Cảm ơn!

Trả lời

57

tl; dr:

  • Vâng, bạn được phép để thêm các mục tùy chỉnh để package.json.
  • Chọn tên chính:
    • chưa được xác định (xem chi tiết bên dưới)
    • không dành riêng để sử dụng trong tương lai (xem chi tiết bên dưới)
    • tránh tiền tố _$
    • và tốt nhất là sử dụng sử dụng đơn top-lev el key trong đó làm tổ các mục tùy chỉnh của bạn.

Ví dụ:, Nếu bạn sở hữu tên miền example.org, bạn có thể lưu trữ một phím tùy chỉnh random như sau, bên trong một chìa khóa cấp cao nhất trong ký hiệu ngược tên-miền-với _ thay thế cho . và, nếu thích hợp, -(xem ý kiến) (ví dụ, org_example):

{ 
    "name": "application-name" 
    , "version": "0.0.1" 
    , "private": true 
    , "dependencies": { 
     "express": "2.4.7" 
    , "jade": ">= 0.0.1" 
    } 
    , "org_example": { 
     "random": true 
    } 
} 
package.json định dạng file

npm 's chủ yếu phù hợp với CommonJS package specification:

Đối với chọn phím tùy chỉnh: các CommonJS package specification bang (tôi nhấn mạnh):

Đoạn phim sau ds là reserved cho tương lai mở rộng: build, default, email, external, files, imports, maintainer, paths, platform, require, summary, test, using, downloads, uid.

Phần mở rộng cho đặc tả mô tả gói phải cố gắng tránh va chạm cho tên chuẩn trong tương lai bằng cách đặt tên khoảng cách của chúng với các tên vô hại không có ý nghĩa liên quan đến quản lý gói chung.

Các trường sau đây dành cho gói quan đăng ký sử dụng theo quyết định của họ: id, type. Tất cả các thuộc tính bắt đầu bằng _ hoặc $ cũng được đặt trước để đăng ký gói để sử dụng theo quyết định của mình.

+1

Cảm ơn thông tin chi tiết. Có bất kỳ lý do nào bạn đề nghị '" org_example "' thay vì '" org.example "' - hoặc một không gian tên giống như XML "" http://example.org "'? – tomekwi

+0

- hoặc [phạm vi NPM] (https://github.com/npm/npm/issues/5239) -style '" @example "'? – tomekwi

+2

@tomekwi: Bạn _could_ sử dụng 'org.example' hoặc' http: // example.org', nhưng, với điều kiện các tên khóa JSON cũng là các tên thuộc tính đối tượng JavaScript, nó sẽ làm cho nó khó xử khi truy cập các thuộc tính này sau, bởi vì bạn phải sử dụng một cái gì đó như 'pkg ['org.example']', bởi vì cú pháp 'pkg. ' tự nhiên hơn sẽ không hoạt động với chúng. – mklement0

19

Với bản chất của JSON và tuyên bố này từ Nodejitsu documentation Tôi không thấy điều gì sai trái với điều đó.

NPM chính nó là chỉ biết hai trường trong package.json:

{ 
    "name" : "barebones", 
    "version" : "0.0.0", 
} 

NPM cũng quan tâm đến một vài lĩnh vực được liệt kê here. Vì vậy, miễn là nó là JSON hợp lệ và không can thiệp vào Node.js hoặc NPM, mọi thứ sẽ ổn và hợp lệ.

Nhận thức của Node về các tệp package.json dường như kéo dài đến trường chính chính. Ref.

{ "name" : "some-library", 
    "main" : "./lib/some-library.js" } 

Nếu đây là trong một thư mục tại ./some-library, sau đó yêu cầu ('./ một số thư viện') sẽ cố gắng để tải ./some-library/lib/some- library.js.

Đây là mức độ nhận thức của Node về các tệp package.json.

Để tránh các xung đột có thể xảy ra, bạn nên đặt tiền tố cho khóa bằng một số ký tự hoặc từ. Dấu gạch dưới là một biến thể phổ biến.

+3

Nó quan tâm đến nhiều trường hơn: P – Raynos

+6

Với lợi ích của 2 năm trở ngại: npm quan tâm đến nhiều trường khác (và nút chính nó về một tập con của chúng) - xem https://www.npmjs.org /doc/files/package.json.html. KHÔNG sử dụng '_' (hoặc' $ ') cho thuộc tính tùy chỉnh:" Tất cả các thuộc tính bắt đầu bằng _ hoặc $ cũng được dành riêng cho các gói đăng ký để sử dụng theo quyết định của chúng. " - http://wiki.commonjs.org/wiki/Packages/1.1 Xem [câu trả lời của tôi] (http://stackoverflow.com/a/27232456/45375) để biết thêm. – mklement0

+3

Tôi thực sự khuyên bạn nên đọc [câu trả lời cập nhật của @ mklement0] (http://stackoverflow.com/a/27232456/2816199). – tomekwi

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