npm + PyPI 双平台发布实战:从零到自动化的完整踩坑记录 📅 发布时间:2026/7/11 6:02:37 👁️ 浏览次数: 两个项目、两个平台、一个下午。npm 的 Granular Token、PyPI 的 twine 编码坑、GitHub Actions 的 CI/CD 管线——全部走通后的完整记录。背景最近做了两个开源项目项目语言类型发布平台GEO CopilotJavaScriptChrome 扩展npmLAN TransferPython命令行工具PyPI两个都是零依赖的轻量项目但发布流程走了不少弯路。这篇文章把两条路线一次性讲清楚下次照着走15 分钟一个。第一部分npm 发布GEO Copilot项目准备GEO Copilot 是 Chrome 扩展纯 HTMLCSSJS零依赖。需要新增✅ package.json # npm 包配置 ✅ package-lock.json # 依赖锁空包也要 ✅ test/basic.test.js # 基础测试 ✅ .github/workflows/npm-publish.yml ✅ .gitattributes # 统一换行符package.json 关键配置{name:aicdragon/geo-copilot,version:0.1.0,description:GEO workflow browser extension,files:[manifest.json,src/,assets/,README.md],scripts:{test:node test/basic.test.js},publishConfig:{access:public}}踩坑包名geo-copilot被 npm 拒绝和已有geocopilot太相似改用aicdragon/geo-copilot。CI/CD 配置name:Node.js Packageon:release:types:[created]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-nodev4with:{node-version:20}-run:npm install# 注意用 install 不用 ci-run:npm testpublish-npm:needs:buildruns-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-nodev4with:node-version:20registry-url:https://registry.npmjs.org/-run:npm install-run:npm publish--access publicenv:NODE_AUTH_TOKEN:${{secrets.npm_token}}npm Token — 2026 版全坑记录2025 年 11 月起npm 只支持Granular Access TokenClassic Token 取消。正确流程npmjs.com → 头像 → Access Tokens →Granular Access Token必选Packages and scopes →All Packages下拉里有不是搜索必选Permissions →Read and write必勾✅Bypass two-factor authentication没勾 403GitHub Secrets → 新建npm_tokennpm 报错速查报错原因解决401 UnauthorizedToken 无效重新生成403 2FA required没勾 Bypass 2FA重新生成勾上404 Not Found包名冲突/无权限改用用户名/包名403 too similar包名和已有包太像加作用域前缀CInpm ci挂lockfile 版本不兼容改用npm installRe-run 失败用旧 commit 重跑删 tag 重建 Release第二部分PyPI 发布LAN Transfer项目准备LAN Transfer 是 Python 工具零依赖纯标准库。需要新增✅ pyproject.toml # 现代 Python 打包标准 ✅ test/test_transfer.py # 导入测试 ✅ .github/workflows/pypi-publish.yml ✅ .gitattributes # 统一换行符pyproject.toml 关键配置[build-system] requires [setuptools64, wheel] build-backend setuptools.build_meta [project] name lan-transfer version 0.1.0 description LAN AirDrop — zero-dependency network file transfer tool requires-python 3.8 dependencies [] # 零第三方依赖 [project.scripts] lan-transfer lan_transfer:main lan-transfer-gui lan_transfer_gui:main踩坑build-backend别写setuptools.backends._legacy——新版本里改名了直接用setuptools.build_meta。CI/CD 配置name:Python Packageon:release:types:[created]jobs:build:runs-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-pythonv5with:{python-version:3.12}-run:pip install build-run:python-m build-run:pip install dist/*.whl-run:python test/test_transfer.pypublish-pypi:needs:buildruns-on:ubuntu-lateststeps:-uses:actions/checkoutv4-uses:actions/setup-pythonv5with:{python-version:3.12}-run:pip install build-run:python-m build-uses:pypa/gh-action-pypi-publishrelease/v1with:password:${{secrets.PYPI_TOKEN}}PyPI Token和 npm 不同PyPI 的 Token 生成简单得多pypi.org → Account Settings → API tokens → Add API tokenScopeEntire account生成后复制 → GitHub Secrets →PYPI_TOKENtwine 上传踩坑Windows 终端编码导致 twine 进度条崩溃UnicodeEncodeError: gbk codec cant encode character \u2022解决加--disable-progress-bar并设置PYTHONUTF81。$env:PYTHONUTF8 1python-m twine upload--disable-progress-bar dist/*dist 目录注意PyInstaller 打包生成的.exe也在dist/里twine 会报InvalidDistribution。只上传.whl和.tar.gz。第三部分双平台对比npmPyPI配置文件package.jsonpyproject.toml构建命令npm installpython -m build测试命令npm testpython test/xxx.pyToken 类型Granular2026强制API Token简单Token 复杂度⭐⭐⭐⭐⭐5 步选⭐1 步2FA 问题必须勾 Bypass默认不需要包名冲突加scope解决直接换名发布命令npm publishtwine upload dist/*CI 发布setup-nodepypa/gh-action-pypi-publish安装命令npm i scope/pkgpip install pkgGitHub Secretnpm_tokenPYPI_TOKEN结论PyPI 的发布体验比 npm 顺滑太多了——npm 2026 年的 Granular Token 流程真的过于复杂。第四部分统一速查清单npm 发布□ 1. package.json 有 name/scope、scripts.test、publishConfig、files □ 2. npm install → package-lock.json 生成 □ 3. npm test 本地通过 □ 4. .github/workflows/npm-publish.yml 配置完成 □ 5. npmjs.com → Granular Token → All Packages → ReadWrite → Bypass 2FA □ 6. GitHub Secrets → npm_token 已存入 □ 7. Git push → GitHub Release → 等待 Actions 绿灯PyPI 发布□ 1. pyproject.toml 有 name、version、scripts、build-system □ 2. python -m build → 生成 .whl .tar.gz □ 3. python test/ 测试通过 □ 4. .github/workflows/pypi-publish.yml 配置完成 □ 5. pypi.org → API Token → Entire account □ 6. GitHub Secrets → PYPI_TOKEN 已存入 □ 7. Git push → GitHub Release → 等待 Actions 绿灯两个都需要的通用配置□ .gitattributes 存在统一 LF 换行符 □ GitHub Release 触发 CIRe-run 用旧 commit需删 tag 重建 □ 首次发布建议本地手动跑一次排查命名冲突和权限问题五、本次成功案例项目平台包名链接GEO Copilotnpmaicdragon/geo-copilotnpmjs.comLAN TransferPyPIlan-transferpypi.org两个项目从零到双平台发布总共踩了这些坑npm Granular Token 必须选 All Packages Bypass 2FAnpm 包名冲突加scope前缀GitHub Actionsnpm ci改用npm installRe-run 用的是旧 commit需删 tag 重建 ReleasePyPI twine 在 Windows 终端编码崩溃dist/里有 PyInstaller 的 exetwine 报 InvalidDistributionbuild-backend老教程写的是已废弃的_legacy希望这份记录能帮你下次少踩这些坑。 相关资源npmnpmjs.com/package/aicdragon/geo-copilotPyPIpypi.org/project/lan-transferGitHubCDragon123-code/geo-copilot | CDragon123-code/lan-file-transfer
海外APP小程序开发 选对公司,省一半麻烦 随着跨境贸易、海外本地生活、跨境社交与电商业态的持续成熟,越来越多出海企业、外贸商家与跨境创业者开始布局自有数字化载体。相较于第三方平台流量受限、佣金高昂、用户数据无法自留的痛点,独立海外APP、跨境多语言小程序,已经成为品牌深耕… 2026/7/11 6:02:37
Unity体绘制实战:用Texture3D为可变长方体实现动态体积着色 1. 项目概述:为什么我们需要告别传统贴图?在Unity里给一个长方体上色,听起来像是新手教程里的第一课——创建一个Cube,拖个材质球,贴张图,完事。但如果你做的不是静态的箱子,而是一个尺寸、比例… 2026/7/11 5:58:35
RS485 上下拉电阻计算实战:从 2 节点到 32 节点的 4 种场景公式推导 RS485上下拉电阻工程计算指南:从基础理论到多节点实战在工业自动化、楼宇控制等场景中,RS485总线因其抗干扰能力强、传输距离远等优势成为首选通信方案。但许多工程师在实际部署时都会遇到一个共性难题:当总线空闲或部分节点离线时࿰… 2026/7/11 5:56:35
League Akari助手:智能游戏助手如何彻底改变你的英雄联盟游戏体验 League Akari助手:智能游戏助手如何彻底改变你的英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari助手… 2026/7/11 7:33:12
L9958与STM32F091RC电机控制方案设计与优化 1. 为什么选择L9958与STM32F091RC组合?在电机控制领域,硬件选型往往决定了系统性能的上限。L9958是STMicroelectronics推出的一款专为汽车级应用设计的H桥驱动器芯片,而STM32F091RC则是基于ARM Cortex-M0内核的微控制器。这两者的组合在工业伺… 2026/7/11 7:33:12
红日4靶场 Docker 特权逃逸实战:3步挂载宿主机磁盘获取 root 权限 Docker特权模式逃逸实战:从容器到宿主机的权限突破1. 特权模式逃逸技术原理当容器以特权模式(--privileged)启动时,Docker会解除所有默认的权限限制,这意味着:容器可以访问主机上的所有设备容器拥有几乎所有… 2026/7/11 7:31:11
【航空航天】太棒了!今天(2026年7月10日)长征十号乙运载火箭首飞告捷,并成功实现一子级海上回收,这确实是中国航天的历史性时刻!为王的诞生献上掌声! 🚀 历史性突破!长征十号乙首飞告捷,一子级海上回收圆满成功! 2026年7月10日,长征十号乙运载火箭在海南商业航天发射场成功发射,火箭一二级分离约6分钟后,一子级垂直返回,通过全球首… 2026/7/11 7:31:11
Tri Mode Ethernet MAC v9.0 多核例化:解决 IODELAY_GROUP 约束冲突的 3 步方案 Tri Mode Ethernet MAC v9.0 多核例化:解决 IODELAY_GROUP 约束冲突的 3 步方案在FPGA设计中,Tri Mode Ethernet MAC(TEMAC)IP核因其支持10/100/1000Mbps三种速率模式而广受欢迎。然而,当设计需要例化多个TEMAC实例时&… 2026/7/11 7:27:10
环境迁移部署脚本到测试环境 文章目录 引言 I 服务器文件迁移 递归查找hprof大文件 删除大文件 II 启动脚本修改 复制脚本 start.sh替换独立的单词 uat为test /home替换为空,批量修改脚本路径 递归地对当前目录及其所有子目录中的 start.sh文件执行 /home替换为空的操作 III 修改Jenkins配置 需求:从UAT环… 2026/7/11 7:23:09
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/7 11:26:57
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/8 20:15:17
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/8 14:25:08