tanmi-dock 0.4.0-beta.6 → 0.5.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/link.d.ts.map +1 -1
- package/dist/commands/link.js +273 -89
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -3
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/unlink.d.ts.map +1 -1
- package/dist/commands/unlink.js +5 -0
- package/dist/commands/unlink.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +0 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/codepac.d.ts +43 -0
- package/dist/core/codepac.d.ts.map +1 -1
- package/dist/core/codepac.js +127 -0
- package/dist/core/codepac.js.map +1 -1
- package/dist/core/linker.d.ts +18 -0
- package/dist/core/linker.d.ts.map +1 -1
- package/dist/core/linker.js +55 -0
- package/dist/core/linker.js.map +1 -1
- package/dist/core/platform.d.ts +5 -0
- package/dist/core/platform.d.ts.map +1 -1
- package/dist/core/platform.js +16 -0
- package/dist/core/platform.js.map +1 -1
- package/dist/core/store.d.ts +87 -0
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/store.js +208 -0
- package/dist/core/store.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/utils/prompt.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -256,20 +256,37 @@ tanmi-dock repair [options]
|
|
|
256
256
|
|
|
257
257
|
## 目录结构
|
|
258
258
|
|
|
259
|
+
### Store 结构 (v0.6.0+)
|
|
260
|
+
|
|
259
261
|
```
|
|
260
262
|
Store/
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
└──
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
263
|
+
└── libImageCodec/
|
|
264
|
+
└── 38648c31/
|
|
265
|
+
├── macOS/ # 平台特定内容
|
|
266
|
+
├── iOS/
|
|
267
|
+
├── android/
|
|
268
|
+
└── _shared/ # 共享文件
|
|
269
|
+
├── codepac-dep.json
|
|
270
|
+
├── *.cmake
|
|
271
|
+
└── README.md
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
**平台目录识别规则**: macOS, macOS-asan, Win, iOS, iOS-asan, android, android-asan, android-hwasan, ubuntu, wasm, ohos
|
|
275
|
+
|
|
276
|
+
其他文件/目录都归入 `_shared/`。
|
|
277
|
+
|
|
278
|
+
### 链接后的项目结构
|
|
279
|
+
|
|
280
|
+
```
|
|
281
|
+
3rdParty/libImageCodec/
|
|
282
|
+
├── macOS/ → Store/.../macOS/ (符号链接)
|
|
283
|
+
├── iOS/ → Store/.../iOS/ (符号链接)
|
|
284
|
+
├── codepac-dep.json (复制)
|
|
285
|
+
└── *.cmake (复制)
|
|
270
286
|
```
|
|
271
287
|
|
|
272
|
-
|
|
288
|
+
- **平台目录**: 符号链接到 Store,节省空间
|
|
289
|
+
- **共享文件**: 物理复制,避免多项目冲突
|
|
273
290
|
|
|
274
291
|
## 开发
|
|
275
292
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAuJD,eAAe,iBAAiB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/commands/link.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAkB3C;AAyzBD,eAAe,iBAAiB,CAAC"}
|
package/dist/commands/link.js
CHANGED
|
@@ -10,7 +10,7 @@ import { getRegistry } from '../core/registry.js';
|
|
|
10
10
|
import * as store from '../core/store.js';
|
|
11
11
|
import * as linker from '../core/linker.js';
|
|
12
12
|
import * as codepac from '../core/codepac.js';
|
|
13
|
-
import { resolvePath } from '../core/platform.js';
|
|
13
|
+
import { resolvePath, getPlatformHelpText } from '../core/platform.js';
|
|
14
14
|
import { Transaction } from '../core/transaction.js';
|
|
15
15
|
import { formatSize, checkDiskSpace } from '../utils/disk.js';
|
|
16
16
|
import { getDirSize } from '../utils/fs-utils.js';
|
|
@@ -31,6 +31,7 @@ export function createLinkCommand() {
|
|
|
31
31
|
.option('-y, --yes', '跳过确认提示')
|
|
32
32
|
.option('--no-download', '不自动下载缺失库')
|
|
33
33
|
.option('--dry-run', '只显示将要执行的操作')
|
|
34
|
+
.addHelpText('after', getPlatformHelpText())
|
|
34
35
|
.action(async (projectPath, options) => {
|
|
35
36
|
await ensureInitialized();
|
|
36
37
|
try {
|
|
@@ -158,60 +159,167 @@ async function linkProject(projectPath, options) {
|
|
|
158
159
|
const { dependency, status, localPath } = item;
|
|
159
160
|
const libKey = registry.getLibraryKey(dependency.libName, dependency.commit);
|
|
160
161
|
// 主平台用于 absorb 等单平台操作
|
|
161
|
-
const
|
|
162
|
-
|
|
162
|
+
const _primaryPlatform = platforms[0];
|
|
163
|
+
// 检查 Store 版本兼容性(v0.5 旧结构会报错)
|
|
164
|
+
await store.ensureCompatibleStore(storePath, dependency.libName, dependency.commit);
|
|
163
165
|
switch (status) {
|
|
164
166
|
case DependencyStatus.LINKED:
|
|
165
167
|
// 已链接,跳过
|
|
166
168
|
break;
|
|
167
|
-
case DependencyStatus.RELINK:
|
|
168
|
-
//
|
|
169
|
+
case DependencyStatus.RELINK: {
|
|
170
|
+
// 重建链接(Store 已有,直接 linkLib)
|
|
171
|
+
const relinkCommitPath = path.join(storePath, dependency.libName, dependency.commit);
|
|
169
172
|
tx.recordOp('unlink', localPath);
|
|
170
173
|
await linker.unlink(localPath);
|
|
171
|
-
tx.recordOp('link', localPath,
|
|
172
|
-
await linker.
|
|
174
|
+
tx.recordOp('link', localPath, relinkCommitPath);
|
|
175
|
+
await linker.linkLib(localPath, relinkCommitPath, platforms);
|
|
173
176
|
success(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 重建链接 [${platforms.join(', ')}]`);
|
|
174
177
|
break;
|
|
178
|
+
}
|
|
175
179
|
case DependencyStatus.REPLACE: {
|
|
176
|
-
//
|
|
180
|
+
// Store 已有,删除本地目录,直接 linkLib
|
|
177
181
|
const replaceSize = await getDirSize(localPath);
|
|
178
|
-
|
|
179
|
-
|
|
182
|
+
const replaceCommitPath = path.join(storePath, dependency.libName, dependency.commit);
|
|
183
|
+
tx.recordOp('replace', localPath, replaceCommitPath);
|
|
184
|
+
await linker.linkLib(localPath, replaceCommitPath, platforms);
|
|
180
185
|
savedBytes += replaceSize;
|
|
181
186
|
success(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - Store 已有,创建链接 [${platforms.join(', ')}]`);
|
|
182
187
|
break;
|
|
183
188
|
}
|
|
184
189
|
case DependencyStatus.ABSORB: {
|
|
185
|
-
// 移入 Store
|
|
190
|
+
// 移入 Store(吸收本地目录所有平台内容)
|
|
186
191
|
const absorbSize = await getDirSize(localPath);
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
await
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
192
|
+
const storeCommitPath = path.join(storePath, dependency.libName, dependency.commit);
|
|
193
|
+
// 1. 扫描本地平台目录
|
|
194
|
+
const { KNOWN_PLATFORM_VALUES } = await import('../core/platform.js');
|
|
195
|
+
const localDirEntries = await fs.readdir(localPath, { withFileTypes: true });
|
|
196
|
+
const localPlatforms = localDirEntries
|
|
197
|
+
.filter(entry => entry.isDirectory() && KNOWN_PLATFORM_VALUES.includes(entry.name))
|
|
198
|
+
.map(entry => entry.name);
|
|
199
|
+
// 2. 检测额外平台(本地有但用户未请求的)
|
|
200
|
+
const extraPlatforms = localPlatforms.filter(p => !platforms.includes(p));
|
|
201
|
+
// 3. 确定最终要吸收的平台
|
|
202
|
+
let finalPlatforms = platforms;
|
|
203
|
+
if (extraPlatforms.length > 0 && !options.yes && process.stdout.isTTY) {
|
|
204
|
+
info(`检测到额外平台: ${extraPlatforms.join(', ')}`);
|
|
205
|
+
const { select } = await import('@inquirer/prompts');
|
|
206
|
+
const choice = await select({
|
|
207
|
+
message: `本地有 ${extraPlatforms.length} 个额外平台,如何处理?`,
|
|
208
|
+
choices: [
|
|
209
|
+
{ name: '全部吸收 (所有本地平台都移入 Store)', value: 'absorb_all' },
|
|
210
|
+
{ name: '只吸收请求的平台 (额外平台保留在本地)', value: 'absorb_requested' },
|
|
211
|
+
],
|
|
212
|
+
});
|
|
213
|
+
if (choice === 'absorb_all') {
|
|
214
|
+
finalPlatforms = [...platforms, ...extraPlatforms];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
tx.recordOp('absorb', localPath, storeCommitPath);
|
|
218
|
+
const absorbResult = await store.absorbLib(localPath, finalPlatforms, dependency.libName, dependency.commit);
|
|
219
|
+
// 获取所有可链接的平台(新吸收 + 已存在跳过的)
|
|
220
|
+
const linkPlatforms = [...Object.keys(absorbResult.platformPaths), ...absorbResult.skippedPlatforms];
|
|
221
|
+
if (linkPlatforms.length > 0) {
|
|
222
|
+
tx.recordOp('link', localPath, storeCommitPath);
|
|
223
|
+
await linker.linkLib(localPath, storeCommitPath, linkPlatforms);
|
|
224
|
+
// 为每个平台创建 StoreEntry 并添加引用
|
|
225
|
+
for (const platform of linkPlatforms) {
|
|
226
|
+
const storeKey = registry.getStoreKey(dependency.libName, dependency.commit, platform);
|
|
227
|
+
if (!registry.getStore(storeKey)) {
|
|
228
|
+
const platformSize = await store.getSize(dependency.libName, dependency.commit, platform);
|
|
229
|
+
registry.addStore({
|
|
230
|
+
libName: dependency.libName,
|
|
231
|
+
commit: dependency.commit,
|
|
232
|
+
platform,
|
|
233
|
+
branch: dependency.branch,
|
|
234
|
+
url: dependency.url,
|
|
235
|
+
size: platformSize,
|
|
236
|
+
usedBy: [],
|
|
237
|
+
createdAt: new Date().toISOString(),
|
|
238
|
+
lastAccess: new Date().toISOString(),
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
registry.addStoreReference(storeKey, projectHash);
|
|
242
|
+
}
|
|
243
|
+
// 兼容旧结构:也添加 LibraryInfo
|
|
244
|
+
const libKey = registry.getLibraryKey(dependency.libName, dependency.commit);
|
|
245
|
+
if (!registry.getLibrary(libKey)) {
|
|
246
|
+
registry.addLibrary({
|
|
247
|
+
libName: dependency.libName,
|
|
248
|
+
commit: dependency.commit,
|
|
249
|
+
branch: dependency.branch,
|
|
250
|
+
url: dependency.url,
|
|
251
|
+
platforms: linkPlatforms,
|
|
252
|
+
size: absorbSize,
|
|
253
|
+
referencedBy: [],
|
|
254
|
+
createdAt: new Date().toISOString(),
|
|
255
|
+
lastAccess: new Date().toISOString(),
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
hint(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 本地已有,移入 Store [${linkPlatforms.join(', ')}]`);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
warn(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 本地目录不含任何平台内容,跳过`);
|
|
262
|
+
}
|
|
204
263
|
break;
|
|
205
264
|
}
|
|
206
265
|
case DependencyStatus.MISSING:
|
|
207
266
|
// 跳过,后续并行处理
|
|
208
267
|
break;
|
|
209
|
-
case DependencyStatus.LINK_NEW:
|
|
210
|
-
// Store
|
|
211
|
-
|
|
212
|
-
|
|
268
|
+
case DependencyStatus.LINK_NEW: {
|
|
269
|
+
// Store 已有(至少一个平台),本地无,检查平台完整性并补充缺失平台
|
|
270
|
+
const linkNewCommitPath = path.join(storePath, dependency.libName, dependency.commit);
|
|
271
|
+
// 1. 检查平台完整性
|
|
272
|
+
const { missing } = await store.checkPlatformCompleteness(dependency.libName, dependency.commit, platforms);
|
|
273
|
+
// 2. 如果有缺失平台,下载并吸收
|
|
274
|
+
if (missing.length > 0) {
|
|
275
|
+
info(`${dependency.libName} 缺少平台 [${missing.join(', ')}],开始下载...`);
|
|
276
|
+
const downloadResult = await codepac.downloadToTemp({
|
|
277
|
+
url: dependency.url,
|
|
278
|
+
commit: dependency.commit,
|
|
279
|
+
branch: dependency.branch,
|
|
280
|
+
libName: dependency.libName,
|
|
281
|
+
platforms: missing,
|
|
282
|
+
sparse: dependency.sparse,
|
|
283
|
+
});
|
|
284
|
+
try {
|
|
285
|
+
// 过滤:只保留实际下载的且在 missing 列表中的平台
|
|
286
|
+
const filteredMissing = downloadResult.platformDirs.filter(p => missing.includes(p));
|
|
287
|
+
if (filteredMissing.length > 0) {
|
|
288
|
+
tx.recordOp('absorb', downloadResult.libDir, linkNewCommitPath);
|
|
289
|
+
await store.absorbLib(downloadResult.libDir, filteredMissing, dependency.libName, dependency.commit);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
// 清理临时目录
|
|
294
|
+
await fs.rm(downloadResult.tempDir, { recursive: true, force: true }).catch(() => { });
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// 3. linkLib 所有请求的平台
|
|
298
|
+
tx.recordOp('link', localPath, linkNewCommitPath);
|
|
299
|
+
await linker.linkLib(localPath, linkNewCommitPath, platforms);
|
|
300
|
+
// 4. 为每个平台添加 StoreReference
|
|
301
|
+
for (const platform of platforms) {
|
|
302
|
+
const storeKey = registry.getStoreKey(dependency.libName, dependency.commit, platform);
|
|
303
|
+
// 如果 StoreEntry 不存在,创建它
|
|
304
|
+
if (!registry.getStore(storeKey)) {
|
|
305
|
+
const platformSize = await store.getSize(dependency.libName, dependency.commit, platform);
|
|
306
|
+
registry.addStore({
|
|
307
|
+
libName: dependency.libName,
|
|
308
|
+
commit: dependency.commit,
|
|
309
|
+
platform,
|
|
310
|
+
branch: dependency.branch,
|
|
311
|
+
url: dependency.url,
|
|
312
|
+
size: platformSize,
|
|
313
|
+
usedBy: [],
|
|
314
|
+
createdAt: new Date().toISOString(),
|
|
315
|
+
lastAccess: new Date().toISOString(),
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
registry.addStoreReference(storeKey, projectHash);
|
|
319
|
+
}
|
|
213
320
|
success(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 创建链接 [${platforms.join(', ')}]`);
|
|
214
321
|
break;
|
|
322
|
+
}
|
|
215
323
|
}
|
|
216
324
|
// 保存事务进度
|
|
217
325
|
await tx.save();
|
|
@@ -239,78 +347,154 @@ async function linkProject(projectPath, options) {
|
|
|
239
347
|
}
|
|
240
348
|
}
|
|
241
349
|
if (toDownload.length > 0) {
|
|
242
|
-
|
|
243
|
-
info(`开始并行下载 ${toDownload.length} 个库 × ${platforms.length} 个平台 (最多 3 个并发)...`);
|
|
350
|
+
info(`开始并行下载 ${toDownload.length} 个库 (最多 3 个并发)...`);
|
|
244
351
|
blank();
|
|
245
352
|
// 并行控制器,最多同时 3 个下载
|
|
246
353
|
const downloadLimit = pLimit(3);
|
|
247
|
-
//
|
|
354
|
+
// 为每个库下载所有选中的平台(使用 downloadToTemp + absorbLib + linkLib 新流程)
|
|
248
355
|
const downloadTasks = toDownload.map((item) => downloadLimit(async () => {
|
|
249
356
|
const { dependency, localPath } = item;
|
|
250
|
-
const downloadedPlatforms = [];
|
|
251
|
-
const skippedPlatforms = [];
|
|
252
357
|
try {
|
|
253
|
-
|
|
254
|
-
//
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
358
|
+
const storeCommitPath = path.join(storePath, dependency.libName, dependency.commit);
|
|
359
|
+
// 0. 检查平台完整性:避免重复下载已存在的平台
|
|
360
|
+
const { existing, missing } = await store.checkPlatformCompleteness(dependency.libName, dependency.commit, platforms);
|
|
361
|
+
// 如果全部平台已存在,直接 linkLib,无需下载
|
|
362
|
+
if (missing.length === 0) {
|
|
363
|
+
info(`${dependency.libName} 所有平台已存在,直接链接...`);
|
|
364
|
+
tx.recordOp('link', localPath, storeCommitPath);
|
|
365
|
+
await linker.linkLib(localPath, storeCommitPath, platforms);
|
|
366
|
+
// 为每个平台创建 StoreEntry 并添加引用
|
|
367
|
+
for (const platform of platforms) {
|
|
368
|
+
const storeKey = registry.getStoreKey(dependency.libName, dependency.commit, platform);
|
|
369
|
+
if (!registry.getStore(storeKey)) {
|
|
370
|
+
const platformSize = await store.getSize(dependency.libName, dependency.commit, platform);
|
|
371
|
+
registry.addStore({
|
|
372
|
+
libName: dependency.libName,
|
|
373
|
+
commit: dependency.commit,
|
|
374
|
+
platform,
|
|
375
|
+
branch: dependency.branch,
|
|
376
|
+
url: dependency.url,
|
|
377
|
+
size: platformSize,
|
|
378
|
+
usedBy: [],
|
|
379
|
+
createdAt: new Date().toISOString(),
|
|
380
|
+
lastAccess: new Date().toISOString(),
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
registry.addStoreReference(storeKey, projectHash);
|
|
271
384
|
}
|
|
272
|
-
|
|
273
|
-
|
|
385
|
+
// 兼容旧结构:也添加 LibraryInfo
|
|
386
|
+
const libKey = registry.getLibraryKey(dependency.libName, dependency.commit);
|
|
387
|
+
if (!registry.getLibrary(libKey)) {
|
|
388
|
+
let totalSize = 0;
|
|
389
|
+
for (const platform of platforms) {
|
|
390
|
+
totalSize += await store.getSize(dependency.libName, dependency.commit, platform);
|
|
391
|
+
}
|
|
392
|
+
registry.addLibrary({
|
|
393
|
+
libName: dependency.libName,
|
|
394
|
+
commit: dependency.commit,
|
|
395
|
+
branch: dependency.branch,
|
|
396
|
+
url: dependency.url,
|
|
397
|
+
platforms,
|
|
398
|
+
size: totalSize,
|
|
399
|
+
referencedBy: [],
|
|
400
|
+
createdAt: new Date().toISOString(),
|
|
401
|
+
lastAccess: new Date().toISOString(),
|
|
402
|
+
});
|
|
274
403
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if (downloadedPlatforms.length === 0) {
|
|
404
|
+
registry.addReference(libKey, projectHash);
|
|
405
|
+
success(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 链接完成 [${platforms.join(', ')}]`);
|
|
278
406
|
return {
|
|
279
|
-
success:
|
|
407
|
+
success: true,
|
|
280
408
|
name: dependency.libName,
|
|
281
|
-
|
|
282
|
-
skippedPlatforms,
|
|
409
|
+
downloadedPlatforms: platforms,
|
|
410
|
+
skippedPlatforms: [],
|
|
283
411
|
};
|
|
284
412
|
}
|
|
285
|
-
//
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
let totalSize = 0;
|
|
291
|
-
for (const platform of downloadedPlatforms) {
|
|
292
|
-
totalSize += await store.getSize(dependency.libName, dependency.commit, platform);
|
|
293
|
-
}
|
|
294
|
-
registry.addLibrary({
|
|
295
|
-
libName: dependency.libName,
|
|
413
|
+
// 只下载缺失的平台
|
|
414
|
+
info(`下载 ${dependency.libName} [${missing.join(', ')}]...`);
|
|
415
|
+
// 1. 调用 downloadToTemp 只下载缺失的平台
|
|
416
|
+
const downloadResult = await codepac.downloadToTemp({
|
|
417
|
+
url: dependency.url,
|
|
296
418
|
commit: dependency.commit,
|
|
297
419
|
branch: dependency.branch,
|
|
298
|
-
|
|
299
|
-
platforms:
|
|
300
|
-
|
|
301
|
-
referencedBy: [],
|
|
302
|
-
createdAt: new Date().toISOString(),
|
|
303
|
-
lastAccess: new Date().toISOString(),
|
|
420
|
+
libName: dependency.libName,
|
|
421
|
+
platforms: missing,
|
|
422
|
+
sparse: dependency.sparse,
|
|
304
423
|
});
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
424
|
+
try {
|
|
425
|
+
// 2. 过滤平台:只保留实际下载的且在 missing 列表中的平台
|
|
426
|
+
const filteredMissing = downloadResult.platformDirs.filter(p => missing.includes(p));
|
|
427
|
+
// 3. 调用 absorbLib 将临时目录内容移入 Store(如果有下载成功的平台)
|
|
428
|
+
if (filteredMissing.length > 0) {
|
|
429
|
+
tx.recordOp('absorb', downloadResult.libDir, storeCommitPath);
|
|
430
|
+
await store.absorbLib(downloadResult.libDir, filteredMissing, dependency.libName, dependency.commit);
|
|
431
|
+
}
|
|
432
|
+
// 4. 获取所有可链接的平台(已存在 + 新下载成功的)
|
|
433
|
+
const linkPlatforms = [...existing, ...filteredMissing];
|
|
434
|
+
if (linkPlatforms.length === 0) {
|
|
435
|
+
return {
|
|
436
|
+
success: false,
|
|
437
|
+
name: dependency.libName,
|
|
438
|
+
skipped: true,
|
|
439
|
+
skippedPlatforms: platforms,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
// 5. 调用 linkLib 创建符号链接并复制共享文件
|
|
443
|
+
tx.recordOp('link', localPath, storeCommitPath);
|
|
444
|
+
await linker.linkLib(localPath, storeCommitPath, linkPlatforms);
|
|
445
|
+
// 6. 为每个平台创建 StoreEntry 并添加引用
|
|
446
|
+
for (const platform of linkPlatforms) {
|
|
447
|
+
const storeKey = registry.getStoreKey(dependency.libName, dependency.commit, platform);
|
|
448
|
+
if (!registry.getStore(storeKey)) {
|
|
449
|
+
const platformSize = await store.getSize(dependency.libName, dependency.commit, platform);
|
|
450
|
+
registry.addStore({
|
|
451
|
+
libName: dependency.libName,
|
|
452
|
+
commit: dependency.commit,
|
|
453
|
+
platform,
|
|
454
|
+
branch: dependency.branch,
|
|
455
|
+
url: dependency.url,
|
|
456
|
+
size: platformSize,
|
|
457
|
+
usedBy: [],
|
|
458
|
+
createdAt: new Date().toISOString(),
|
|
459
|
+
lastAccess: new Date().toISOString(),
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
registry.addStoreReference(storeKey, projectHash);
|
|
463
|
+
}
|
|
464
|
+
// 兼容旧结构:也添加 LibraryInfo
|
|
465
|
+
const libKey = registry.getLibraryKey(dependency.libName, dependency.commit);
|
|
466
|
+
if (!registry.getLibrary(libKey)) {
|
|
467
|
+
let totalSize = 0;
|
|
468
|
+
for (const platform of linkPlatforms) {
|
|
469
|
+
totalSize += await store.getSize(dependency.libName, dependency.commit, platform);
|
|
470
|
+
}
|
|
471
|
+
registry.addLibrary({
|
|
472
|
+
libName: dependency.libName,
|
|
473
|
+
commit: dependency.commit,
|
|
474
|
+
branch: dependency.branch,
|
|
475
|
+
url: dependency.url,
|
|
476
|
+
platforms: linkPlatforms,
|
|
477
|
+
size: totalSize,
|
|
478
|
+
referencedBy: [],
|
|
479
|
+
createdAt: new Date().toISOString(),
|
|
480
|
+
lastAccess: new Date().toISOString(),
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
registry.addReference(libKey, projectHash);
|
|
484
|
+
// 计算未能链接的平台(用户请求但未下载也未在 Store 中的)
|
|
485
|
+
const notLinkedPlatforms = platforms.filter((p) => !linkPlatforms.includes(p));
|
|
486
|
+
success(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 下载完成 [${linkPlatforms.join(', ')}]`);
|
|
487
|
+
return {
|
|
488
|
+
success: true,
|
|
489
|
+
name: dependency.libName,
|
|
490
|
+
downloadedPlatforms: linkPlatforms,
|
|
491
|
+
skippedPlatforms: notLinkedPlatforms,
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
finally {
|
|
495
|
+
// 清理临时目录(无论成功还是失败)
|
|
496
|
+
await fs.rm(downloadResult.tempDir, { recursive: true, force: true }).catch(() => { });
|
|
497
|
+
}
|
|
314
498
|
}
|
|
315
499
|
catch (err) {
|
|
316
500
|
error(`${dependency.libName} 下载失败: ${err.message}`);
|