# 如何解决私仓上传包失败的问题

#### 问题现象

ohpm-repo私仓上传包报错，具体表现包括但不限于以下几种场景：

*   场景一：通过web管理端上传.tgz文件时提示“tgz文件中找不到.har或者.hsp文件”。
*   场景二：上传的har包组织名是A，ohpm-repo私仓的组织名是B，无法上传。
*   场景三：上传包时报错：ohpm ERROR: Publish failed, detail: HttpCode 400, The package "xxx" was once published, but has been unpublished, please change the package version and publish it again.
*   场景四：上传包时报错：解析失败！请重新上传。报错页面如下：
    

#### 背景知识

*   ohpm作为OpenHarmony三方库的包管理工具，支持OpenHarmony共享包的发布、安装和依赖管理。
*   ohpm-repo是一个搭建轻量级的ohpm私仓服务的工具。它与ohpm包管理器兼容，并按需缓存所有依赖项，加速私有网络中的安装。
*   将三方库发布到ohpm-repo。

#### 问题定位

*   场景一：检查上传包的格式是否满足ohpm格式要求，格式不对会导致上传报错。
*   场景二：比对上传包的组织名和私仓的组织名，组织名不同的话会无法上传。
*   场景三：根据报错信息可知上传的包是之前发布过的版本，ohpm-repo私仓里发布过的包即使下架了也不能再使用之前发布过的版本。
*   场景四：检查上传方式是否是web管理端上传，部分场景下web管理网页上传会导致解析失败。

#### 分析结论

*   场景一：包格式不对会导致上传报错。
*   场景二：上传包的组织名和私仓的组织名不同导致无法上传。
*   场景三：ohpm-repo私仓里发布过的包即使下架了也不能再使用之前发布过的版本。
*   场景四：部分场景下web管理网页上传会导致解析失败。

#### 修改建议

*   场景一：
    
    用ohpm convert将指定ohpm或npm仓库中的某个包或者本地node\_modules目录下的包转换成满足ohpm格式要求的HAR包，并保存至当前工作目录，转换后的包将支持上传至ohpm-repo私仓或OpenHarmony三方库中心仓。
    
*   场景二：
    
    尝试把har包的组织替换成私仓的组织名：打出来的har包，可以使用tar解压 -> 修改oh-package.json5中name -> 再原样压缩回去 -> 发布。
    
*   场景三：
    *   方案一（推荐）：包改用之前未用过的版本号。
    *   方案二：
        1.  停止当前私仓服务；
        2.  打开私仓的部署目录（私仓启动的时候，可以看到部署到哪里的config file path:xxx)，找到文件夹db下的package\_manifest.json文件；
        3.  删除文件中与下架版本相对应的包数据；
        4.  重新启动私仓，然后上传包。
*   场景四：
    
    可以尝试使用命令行工具发布包：
    
    *   静态共享包HAR包：
        
        执行 ''ohpm publish <HAR包路径>'' 命令发布HAR包，<HAR包路径> 指向的文件后缀需为.har文件的具体路径。
        
    *   动态共享包HSP包：
        
        动态共享包HSP包不能直接发布在ohpm-repo内，需要先转化为.tgz包，转换方法见：编译HSP模块。TGZ包的发布流程同HAR一致。执行 ''ohpm publish <TGZ包路径>'' 命令发布TGZ包，< TGZ 包路径> 指向的文件后缀需为.tgz文件的具体路径。
        
    
    参考文档：使用命令行工具发布。