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 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
- ├── lib-name-1/
262
- └── abc1234/ # commit hash
263
- ├── macOS/ # macOS 平台内容
264
- ├── iOS/ # iOS 平台内容
265
- │ └── android/ # Android 平台内容
266
- └── lib-name-2/
267
- └── def5678/
268
- ├── macOS/
269
- └── Win/
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
- > **说明**: 每个库按 `库名/commit/平台` 的结构存储,支持同一库多平台共存。
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":"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"}
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":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAQ3C;AAuJD,eAAe,iBAAiB,CAAC"}
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":"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"}
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,CAiB3C;AAulBD,eAAe,iBAAiB,CAAC"}
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"}
@@ -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 primaryPlatform = platforms[0];
162
- const primaryStorePath = store.getLibraryPath(storePath, dependency.libName, dependency.commit, primaryPlatform);
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
- // 重建链接(使用 linkLibrary 支持多平台)
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, primaryStorePath);
172
- await linker.linkLibrary(localPath, storePath, dependency.libName, dependency.commit, platforms);
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
- tx.recordOp('replace', localPath, primaryStorePath);
179
- await linker.linkLibrary(localPath, storePath, dependency.libName, dependency.commit, platforms);
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
- tx.recordOp('absorb', localPath, primaryStorePath);
188
- await store.absorb(localPath, dependency.libName, dependency.commit, primaryPlatform);
189
- tx.recordOp('link', localPath, primaryStorePath);
190
- await linker.linkLibrary(localPath, storePath, dependency.libName, dependency.commit, [primaryPlatform]);
191
- // 添加库到注册表
192
- registry.addLibrary({
193
- libName: dependency.libName,
194
- commit: dependency.commit,
195
- branch: dependency.branch,
196
- url: dependency.url,
197
- platforms: [primaryPlatform],
198
- size: absorbSize,
199
- referencedBy: [],
200
- createdAt: new Date().toISOString(),
201
- lastAccess: new Date().toISOString(),
202
- });
203
- hint(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 本地已有,移入 Store [${primaryPlatform}]`);
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
- tx.recordOp('link', localPath, primaryStorePath);
212
- await linker.linkLibrary(localPath, storePath, dependency.libName, dependency.commit, platforms);
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
- const totalDownloads = toDownload.length * platforms.length;
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
- info(`下载 ${dependency.libName} [${platforms.join(', ')}]...`);
254
- // 依次下载每个平台
255
- for (const platform of platforms) {
256
- const storeLibPath = store.getLibraryPath(storePath, dependency.libName, dependency.commit, platform);
257
- tx.recordOp('download', storeLibPath);
258
- await codepac.installSingle({
259
- url: dependency.url,
260
- commit: dependency.commit,
261
- branch: dependency.branch,
262
- targetDir: storeLibPath,
263
- platform: platform,
264
- sparse: dependency.sparse,
265
- });
266
- // 验证平台目录是否有有效内容
267
- const isValid = await store.validatePlatform(dependency.libName, dependency.commit, platform);
268
- if (!isValid) {
269
- await store.remove(dependency.libName, dependency.commit, platform);
270
- skippedPlatforms.push(platform);
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
- else {
273
- downloadedPlatforms.push(platform);
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: false,
407
+ success: true,
280
408
  name: dependency.libName,
281
- skipped: true,
282
- skippedPlatforms,
409
+ downloadedPlatforms: platforms,
410
+ skippedPlatforms: [],
283
411
  };
284
412
  }
285
- // 使用 linkLibrary 创建链接(支持多平台)
286
- const primaryStorePath = store.getLibraryPath(storePath, dependency.libName, dependency.commit, downloadedPlatforms[0]);
287
- tx.recordOp('link', localPath, primaryStorePath);
288
- await linker.linkLibrary(localPath, storePath, dependency.libName, dependency.commit, downloadedPlatforms);
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
- url: dependency.url,
299
- platforms: downloadedPlatforms,
300
- size: totalSize,
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
- const libKey = registry.getLibraryKey(dependency.libName, dependency.commit);
306
- registry.addReference(libKey, projectHash);
307
- success(`${dependency.libName} (${dependency.commit.slice(0, 7)}) - 下载完成 [${downloadedPlatforms.join(', ')}]`);
308
- return {
309
- success: true,
310
- name: dependency.libName,
311
- downloadedPlatforms,
312
- skippedPlatforms,
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}`);