SayMeeveTime

问题:frpc 配置、Docker 镜像兼容性与 Lerna 包发布

avatar

Chester

解决开发中的常见问题:frpc 配置、Docker 镜像兼容性与 Lerna 包发布

在软件开发过程中,我们经常会遇到各种各样的问题。本文将总结我在解决 frpc 配置、Docker 镜像兼容性以及 Lerna 包发布问题时的一些经验,希望能帮助到其他开发者。

一、Frpc 配置与进程管理

1.1. 问题描述

在使用 frpc 进行内网穿透时,我遇到了以下问题:

  • 通过 launchctl unload 卸载 frpc.plist 配置文件时出现 "Input/output error"。
  • 即使卸载了配置文件,frpc 进程仍然不断重启。

1.2. 问题分析

  • launchctl unload 错误: 这是因为 LaunchAgents 目录是用户级别的,而以 root 权限运行 launchctl 命令通常用于操作系统级别的 LaunchDaemons 目录。
  • frpc 进程不断重启: 这是因为 frpc 进程是由 launchctl 启动的,即使手动杀死了进程,launchctl 也会自动重启它。

1.3. 解决方案

  • 使用用户权限操作 launchctl 最佳实践是避免以 root 权限操作用户级别的 LaunchAgent。 优先使用用户权限的 launchctl unload 命令:

    launchctl unload ~/Library/LaunchAgents/frpc.plist

    如果仍然遇到权限问题,请确保您对 frpc.plist 文件具有所有权。

  • 准确查找并杀死 frpc 进程: 使用 pgrep 命令更准确地查找进程 ID,然后使用 kill 命令停止进程:

    pgrep frpc
    kill <进程ID>

    如果进程拒绝被杀死,可以使用 -9 选项强制杀死它:kill -9 <进程ID>

  • 阻止 frpc 进程重启: 在卸载 launchctl 任务之后,再次使用 pgrep frpcps aux | grep frpc 命令检查 frpc 进程是否仍然在运行。 如果它还在运行,请重复步骤 2 杀死它。

1.4. Frpc 配置文件问题排查

在确保 frpc 进程停止后,还需要检查 frpc 的配置文件,确保其配置正确。 常见的问题包括:

  • localIP 的有效性: 确保 localIP 的值对于每个代理都是正确的、可访问的 IP 地址。
  • 端口冲突: 使用 netstat -tulnp 命令(Linux)或 netstat -an | grep <端口号> 命令(macOS)来检查是否有其他进程占用了您配置的 remotePort
  • 网络连接: 确保服务器(运行 frpc 的机器)可以访问内网机器。
  • 查看 frpc 日志: 仔细查看 frpc 的日志文件,通常位于 frpc 所在的目录或 /var/log 目录下。

二、Docker 镜像兼容性与 XXL-Job-Admin

2.1. 问题描述

在使用 Docker Compose 部署 XXL-Job-Admin 时,我遇到了以下问题:

  • 在 Mac M 系列芯片上运行 XXL-Job-Admin 容器失败,提示 "Error pull access denied for portainerci/xxl-job-admin"。

2.2. 问题分析

  • 镜像架构不兼容: Mac M 系列芯片基于 ARM 架构,而 xuxueli/xxl-job-admin:2.4.0 镜像可能不是为 ARM 架构构建的,导致无法直接运行。
  • 镜像仓库不存在或权限问题: 尝试使用的 portainerci/xxl-job-admin 镜像可能并不公开可用,或者需要登录 Docker Hub 才能访问。

2.3. 解决方案

  • 自行构建 ARM 架构的镜像 (推荐): 这是最可靠的解决方案。 从 XXL-Job 的官方 GitHub 仓库克隆源代码,然后使用 Dockerfile 构建一个支持 ARM 架构的镜像。

  • 修改 Dockerfile:

    FROM openjdk:8-jdk-alpine
    MAINTAINER xuxueli
    
    # Add volume for log files
    VOLUME /data/applogs
    
    # Copy war file
    COPY xxl-job-admin.war /app.war
    
    # Entrypoint
    ENTRYPOINT ["java","-jar","/app.war"]
  • 构建镜像:

    docker build -t your-dockerhub-username/xxl-job-admin:latest .
  • 修改 docker-compose.yml 文件:xxl-job-admin 的镜像更换为自行构建的镜像:

    xxl-job-admin:
      image: your-dockerhub-username/xxl-job-admin:latest

三、Lerna 包发布

3.1. 问题描述

在使用 Lerna 发布包时,我遇到了以下问题:

  • E402 You must sign up for private packages 错误:提示我试图发布私有包,但我的 npm 账号没有开通私有包的权限。
  • ENOLICENSE 警告:提示我的包缺少 LICENSE 文件。
  • fatal: tag 'v2.0.0' already exists 错误:提示 Git 标签已经存在。
  • 无法成功进行 Passkey 验证。
  • Lerna 认为当前 HEAD 已经发布,没有需要发布的包。

3.2. 问题分析

  • E402 错误: 这是因为 package.json 文件中可能包含了 private: true 字段,或者 npm 账号没有开通发布私有包的权限。
  • ENOLICENSE 警告: 这是因为包缺少 LICENSE 文件,需要添加许可证信息。
  • Git 标签已经存在: 这是因为之前不成功的发布尝试可能已经创建了 Git 标签,需要删除。
  • Passkey 验证失败: 可能是 Passkey 未正确关联到 npm 账户,Lerna 不支持 Passkey 认证,或者系统或浏览器存在问题。
  • Lerna 认为当前 HEAD 已经发布: 可能是 Lerna 缓存或其他状态导致它认为已经发布了更高的版本。

3.3. 解决方案

  • 检查 package.json 文件: 确保没有 private: true 字段,并确认 "name" 字段的格式是否正确。
  • 添加 LICENSE 文件: 在项目根目录下创建一个 LICENSE.md 文件,并选择一个合适的开源许可证。 在 package.json 文件中添加 "license": "MIT" (如果你选择了 MIT 许可证)。
  • 删除 Git 标签: 使用 git tag -d v2.0.0 删除本地标签,使用 git push origin --delete v2.0.0 删除远程标签。
  • 清除 Lerna 缓存: 运行 lerna clean 清除 Lerna 的缓存。
  • 强制 Git 添加所有更改: 运行 git add -A 强制 Git 添加所有更改。
  • 提交这些更改: 运行 git commit -m "chore: force update package versions to 2.0.0" 提交这些更改。
  • 重新运行 lerna publish 命令: 选择 "Custom Version" 并手动输入 "2.0.0"。
  • 检查 Passkey 配置: 确认 Passkey 是否正确关联到 npm 账户,更新 Lerna 到最新版本,尝试使用其他浏览器,或者暂时降级到基于 OTP 的双因素认证。
    npm install @imooc-cli-dev-chester/utils --prefix packages/core
    lerna exec --scope @imooc-cli-dev-chester/core  -- rm -rf node_modules/

    总结:

在解决 Lerna 发布问题时,需要仔细检查 package.json 文件、Git 状态、Lerna 配置以及 npm 账号权限。 仔细阅读错误信息,逐一排除可能的问题,并确保正确完成身份验证。

希望这些经验能帮助您解决在开发中遇到的类似问题。 编码愉快!

2024056667
powered by SayMeeveTime