惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
P
Privacy International News Feed
T
Tenable Blog
L
Lohrmann on Cybersecurity
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
S
Securelist
C
CXSECURITY Database RSS Feed - CXSecurity.com
Cisco Talos Blog
Cisco Talos Blog
T
The Exploit Database - CXSecurity.com
S
Schneier on Security
P
Privacy & Cybersecurity Law Blog
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
月光博客
月光博客
T
The Blog of Author Tim Ferriss
Scott Helme
Scott Helme
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
C
Cisco Blogs
aimingoo的专栏
aimingoo的专栏
博客园 - 司徒正美
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LangChain Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
阮一峰的网络日志
阮一峰的网络日志
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
Security Latest
Security Latest
Blog — PlanetScale
Blog — PlanetScale
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
博客园 - 三生石上(FineUI控件)
I
InfoQ
Spread Privacy
Spread Privacy
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
MongoDB | Blog
MongoDB | Blog
C
CERT Recently Published Vulnerability Notes
A
About on SuperTechFans
博客园_首页
Engineering at Meta
Engineering at Meta
Project Zero
Project Zero
Latest news
Latest news

aopstudio 的个人博客

一场静悄悄的架构革命:Embedding 模型为何从 Encoder 转向 Decoder - aopstudio 的个人博客 同一个 if 判断,Dify 三种节点跑出三种速度 - aopstudio 的个人博客 手动拼了张4像素的图,JPEG颜色错了,PNG却对了——为什么? - aopstudio 的个人博客 最近的生活节奏:慢一点,也挺好 - aopstudio 的个人博客 HuggingFace 为 LLM Agent 做的读论文工具:`hf papers` - aopstudio 的个人博客 Hugging Face 新工具 hf-mount 解析:把 HF Hub 直接变成本地文件系统 - aopstudio 的个人博客 强化学习知识补课:同样的数据集,SFT 和 RL 学到的东西为什么不一样? - aopstudio 的个人博客 AI 编程工具演进梳理:从 IDE 插件到 CLI Agent,终端为何重新成为开发中心 - aopstudio 的个人博客 让OpenClaw做你的个人电脑代理仍不成熟,但它可以是这个…… - aopstudio 的个人博客 阿里 CoPaw 上手体验:电子宠物养着挺好,生产工具差点意思 - aopstudio 的个人博客
无网/内网环境 Dify 安装插件:用 vendor 绕过 PyPI 依赖问题 - aopstudio 的个人博客
aopstudio · 2026-07-24 · via aopstudio 的个人博客

问题背景

在无网或纯内网环境里为Dify安装插件,pip 源被限制为私有 PyPI 镜像或根本没有源可以访问,没有源肯定无法安装依赖,即便是私有PyPI镜像,也可能存在与PyPI总站的同步不完整或各种奇奇怪怪的情况,导致 pip install 因缺传递依赖而反复失败。

解决思路

思路很简单:在一台有公网的机器上,一次性下载插件所需的所有依赖包及其全部传递依赖,放到项目里,让pip 安装时直接索引到本地路径,不访问任何远程源。

操作步骤

第一步:完整下载依赖

前提:已经下载了插件的完整源码而不是difypkg安装包

具体操作步骤:

在公网机器上(不要求和部署机器相同平台,macOS 也行),把插件的顶层依赖和全部传递依赖一次性下载到 vendor/ 目录。

注意用 --platform 指定目标平台的架构,避免下载到不兼容的二进制包:

# 进入插件项目目录
cd dify-plugin-name

# 下载完整依赖树(只需写顶层依赖,pip download 自动处理传递依赖)
pip download dify_plugin~=0.5.0 \
  -d vendor/ \
  --platform manylinux2014_x86_64 \
  --python-version 3.12 \
  --only-binary=:all:

参数说明:

  • pip download 默认递归下载所有传递依赖
  • --platform manylinux2014_x86_64 确保下载的 wheel 兼容目标 Linux 环境
  • --python-version 3.12 匹配目标 Python 版本(见 manifest.yaml 里的 runner.version
  • --only-binary=:all: 只下载预编译包,避免在无网环境触发编译

第二步:修改 requirements.txt

在原有依赖前面加两行:

--no-index
--find-links vendor/
dify_plugin~=0.5.0
  • --no-index:pip 不访问任何远程索引
  • --find-links vendor/:pip 从本地 vendor/ 目录找包

对于基础 Docker 镜像里已经装好的包(如 certifiidnarequests),pip 会自动跳过,不需要放进 vendor/

第三步:打包部署

在外层目录执行

dify plugin package ./dify-plugin-name

打包完成后上传到 Dify 实例即可。

项目结构

dify-plugin-name/
├── requirements.txt          # --no-index + --find-links vendor/
├── vendor/                   # 完整依赖树的 wheel 文件
│   ├── dify_plugin-0.5.1-py3-none-any.whl
│   ├── httpx-0.28.1-py3-none-any.whl       # 传递依赖,自动下载
│   ├── httpcore-1.0.9-py3-none-any.whl
│   ├── packaging-26.2-py3-none-any.whl
│   └── ...(所有传递依赖)
├── main.py
├── manifest.yaml
└── ...

常见问题

vendor/ 目录太大了怎么办?

vendor里的依赖包加起来大概 11MB,对一个插件项目来说不算大。如果你在意difypkg包的体积,可以在 .difyignore 里排除不需要的文件(如文档、缓存等),但不建议动 vendor/ 里的内容——少一个 wheel 都可能让构建崩掉。

基础镜像里已存在的无需安装

Dify安装插件的基础镜像里面通常已经预装了一些基础包,比如 certifiidnarequeststiktoken 等,那么在 vendor/ 里就不用重复放这些。

如果插件以后新增依赖怎么办?

重新在公网机器上跑一次第一步命令即可。新依赖会被自动下载进 vendor/,旧文件不用删——pip 会按版本选最合适的。