@electron/asar – Lưu trữ Electron
Asar là một định dạng lưu trữ tương tự, nó hoạt động giống như tar
bằng cách nối tất cả các tệp lại với nhau mà không nén, trong khi hỗ trợ truy cập ngẫu nhiên.
Tính năng
- Hỗ trợ truy cập ngẫu nhiên
- Sử dụng JSON để lưu thông tin tệp
- Rất dễ dàng để viết một trình phân tích cú pháp
Tiện ích dòng lệnh
Cài đặt
Module này yêu cầu Node 10 trở lên.
$ npm install --engine-strict @electron/asar
Sử dụng
$ asar --help
Usage: asar [options] [command]
Commands:
pack|p <dir> <output>
create asar archive
list|l <archive>
list files of asar archive
extract-file|ef <archive> <filename>
extract one file from archive
extract|e <archive> <dest>
extract archive
Options:
-h, --help output usage information
-V, --version output the version number
Loại bỏ nhiều tài nguyên khỏi việc đóng gói
Cho trước:
app
(a) ├── x1
(b) ├── x2
(c) ├── y3
(d) │ ├── x1
(e) │ └── z1
(f) │ └── x2
(g) └── z4
(h) └── w1
Loại trừ: a, b
$ asar pack app app.asar --unpack-dir "{x1,x2}"
Loại trừ: a, b, d, f
$ asar pack app app.asar --unpack-dir "**/{x1,x2}"
Loại trừ: a, b, d, f, h
$ asar pack app app.asar --unpack-dir "{**/x1,**/x2,z4/w1}"
Sử dụng theo chương trình
Ví dụ
const asar = require('@electron/asar');
const src = 'some/path/';
const dest = 'name.asar';
await asar.createPackage(src, dest);
console.log('done.');
Lưu ý rằng hiện tại không có xử lý lỗi được cung cấp!
Biến đổi
Bạn có thể truyền vào một tùy chọn biến đổi
, đó là một hàm, mà có thể trả về hoặc không trả về stream.Transform
. Phần sau sẽ được sử dụng trên các tệp sẽ có trong tệp .asar
để biến đổi chúng (ví dụ: nén).
const asar = require('@electron/asar');
const src = 'some/path/';
const dest = 'name.asar';
function transform (filename) {
return new CustomTransformStream()
}
await asar.createPackageWithOptions(src, dest, { transform: transform });
console.log('done.');
Sử dụng với grunt
Cũng có một plugin grunt không chính thức để tạo ra các lưu trữ asar tại bwin/grunt-asar.
Định dạng
Asar sử dụng Pickle để an toàn hóa giá trị nhị phân thành tệp.
Định dạng của asar rất phẳng:
| UInt32: header_size | String: header | Bytes: file1 | ... | Bytes: file42 |
header_size
và header
được tuần tự hóa với lớp Pickle, và đối tượng Pickle của header_size
có 8 byte.
header
là một chuỗi JSON, và header_size
là kích thước của đối tượng Pickle
trong header
.
Cấu trúc của header
giống như sau:
{
"files": {
"tmp": {
"files": {}
},
"usr" : {
"files": {
"bin": {
"files": {
"ls": {
"offset": "0",
"size": 100,
"executable": true,
"integrity": {
"algorithm": "SHA256",
"hash": "...",
"blockSize": 1024,
"blocks": ["...", "..."]
}
},
"cd": {
"offset": "100",
"size": 100,
"executable": true,
"integrity": {
"algorithm": "SHA256",
"hash": "...",
"blockSize": 1024,
"blocks": ["...", "..."]
}
}
}
}
}
},
"etc": {
"files": {
"hosts": {
"offset": "200",
"size": 32,
"integrity": {
"algorithm": "SHA256",
"hash": "...",
"blockSize": 1024,
"blocks": ["...", "..."]
}
}
}
}
}
}
offset
và size
ghi lại thông tin để đọc tệp từ lưu trữ, offset
bắt đầu từ 0 nên bạn phải thêm thủ công kích thước của header_size
và header
vào offset
để có được offset
thực sự của tệp.
offset
là một số UINT64 được biểu diễn dưới dạng chuỗi, vì không có cách nào biểu diễn chính xác UINT64 trong JavaScript Number
. size
là một Number
JavaScript không lớn hơn Number.MAX_SAFE_INTEGER
, có giá trị là 9007199254740991
và có kích thước khoảng 8PB. Chúng tôi không lưu trữ size
trong UINT64 vì kích thước tệp trong Node.js được biểu diễn dưới dạng Number
và việc chuyển đổi từ Number
sang UINT64 không an toàn.
integrity
là một đối tượng gồm một vài khóa:
- Một
algorithm
băm, hiện chỉ hỗ trợSHA256
. - Một giá trị hex được mã hóa
hash
đại diện cho giá trị băm của toàn bộ tệp. - Một mảng các giá trị hex mã hóa cho các
blocks
của tệp. Ví dụ, đối với kích thước blockSize là 4KB, mảng này chứa giá trị băm của mỗi khối nếu bạn chia tệp thành N khối 4KB. - Một giá trị số nguyên
blockSize
đại diện cho kích thước theo byte của mỗi khối trong các giá trị bămblocks
ở trên.
Chi tiết Tải về:
Tác giả: Electron
Mã nguồn: https://github.com/electron/asar
Giấy phép: MIT license