node_modules
每个项目都有几个 GB ,这站里大部分都是前端,应该都懂,不用多说了
最近发现 Python 的 venv 也超大,并且比 Node.js 还离谱,每个项目的 venv 里都还会复制一遍 python 解析器
为什么就不能像.NET 的 NuGet 一样,把依赖都按版本放在一起?放在项目目录里,还要配置版本管理排除
NuGet 的包缓存目录里有版本号,不同依赖版本不会冲突
![]() |
1
seki 1 天前
pnpm:你在想我?
nv:你在想我? |
![]() |
2
seki 1 天前
哦,python 的那个叫 uv
|
3
abcdxe2v 1 天前
历史遗留 不好改了。。
|
![]() |
4
rogerer 1 天前 ![]() 因为存储不值钱
|
5
dcoder 1 天前 ![]() |
6
yuankui 1 天前
yarn2: 你在说我?
|
7
c0t 23 小时 57 分钟前 via iPhone ![]() 我一个以前很讨厌 python 的人,用了 rye + uv 之后,开始喜欢写 python 工具了,特别是嵌入式工具的脚本
|
8
crackidz 23 小时 54 分钟前
Python venv 不应该会复制解析器,直接链接的啊... 但是 venv 和 node_modules 的情况类似,你都需要每个项目复制一遍依赖包,当然情况多少比 node_modules 好一点点
|
9
charlie21 23 小时 29 分钟前
npm: 不同 package 自己在 package.json 里指定了自己的依赖版本,怪我咯?
https://stackoverflow.com/questions/65487385/should-i-duplicate-peerdependencies-in-dependencies-field-of-package-json |
![]() |
10
wangtian2020 22 小时 55 分钟前 ![]() 其他语言什么装包速度也配跟 nodejs 比。我看一了一下新项目的 node_modules 大小只有 500MB 。一般能 node_modules 上 G 的,肯定是什么公司里的屎山代码,这种公司啊,不值得待应该跑路。
node_modules 要是容量大了,那还不是编译了 node-sqlite 、node-sass 之类外来二进制包的锅 |
11
samnya 22 小时 55 分钟前
pnpm 和 uv 都是靠链接,我个人还是更喜欢全局中央仓库的概念,让软件自己去中央仓库找。
依赖版本号冲突的时候,在那里反复安装删除就受不了,用 pip 的肯定都体验过。中央仓库直接什么版本都有,反正调用的时候去取吧。 |
![]() |
12
guiyumin 22 小时 39 分钟前 via iPhone ![]() 现在才$0.1/gb
没必要吧 不要为了节省空间而浪费大家的时间 |
![]() |
13
chengyiqun 22 小时 36 分钟前
uv 这种靠链接, 有时候需要打包一个可执行环境给别人, 还是用 conda 方便些
|
![]() |
14
yolee599 22 小时 35 分钟前 via Android
独立的 venv 也有独立的好处,不同环境不会互相污染,清理的时候文件夹一删就完事
|
![]() |
15
darktutu 22 小时 31 分钟前
那生成 requirements.txt 有什么好方式吗,每次都是切到 venv 环境下一顿处理,才能弄到只有必须的包,要不总会包含很多别的不用的包?才开始使用 python ,希望不吝赐教啊
|
17
Bingchunmoli 22 小时 15 分钟前 via Android
@wangtian2020 没见过公司项目少于 g 的 node_mofules 。。。
|
18
NessajCN 22 小时 0 分钟前
Sounds like a skill issue
|
21
kzfile 21 小时 50 分钟前
非不为也,实不能也
|
22
a33291 21 小时 36 分钟前
@wangtian2020 先不说 node_modules 大,就算 500 也不小了.大部分 c#的包以 nupkg 形式发布(实际上就一个压缩包),基本都是 kb 级别
|
![]() |
23
nziu 21 小时 34 分钟前
历史遗留问题,当初设计的时候就是凑合用能跑就行甚至都没有包管理。
|
24
dcoder 21 小时 15 分钟前
@samnya @chengyiqun
uv 靠链接的主要问题是什么? uv 里的 lock (with version+hash) 还是可以靠谱的重复 build 的. @chengyiqun 还有, 你要打包成执行文件的话, 不是应该靠 pyinstaller 么? 如果只是导出执行环境的话, uv 的配置文件不比让 conda 打包环境更方便么? |
![]() |
25
encro 21 小时 14 分钟前
rye + uv 是非常好用的。
pnpm 也是非常好用的。 conda 也是非常 nice 的。 |
![]() |
26
maocat 20 小时 51 分钟前 via Android
看了 op 的历史帖子,原来是 c 艹艹的死忠啊
|
27
CyouYamato 20 小时 47 分钟前
看了眼正在写的三个 node.js 项目, 两个后端一个前端, 最多的一个是后端也没超过 500MB.好奇上 G 的都是什么重量级的项目?
|
![]() |
28
ipwx 20 小时 41 分钟前
好几年前我也迷信过 static linking 、single binary executable ,觉得这样做个小工具给别人用很 cool 。觉得 python 拖一堆依赖库很麻烦。
现在嘛,面向工资编程了还管这个?依赖库大无所谓,写程序快就行 。 |
![]() |
29
woniu7 20 小时 41 分钟前
我不喜欢 py 和 node 的原因之一就是这个,看来不是我只有我这么认为
觉得这两好的多用别的后端语言都能感觉到差距,生态成就了他们。 向来都是市场决定价值,只要不烂到不行,优秀的东西他没市场就是要凉,哎😮💨 来吧,冲我(引战 |
![]() |
30
Subfire 20 小时 38 分钟前
Maven Gradle 这种就挺好, 去本地中央仓库里自取需要的版本
|
![]() |
31
nomagick 20 小时 38 分钟前
首先开发依赖和运行依赖是不一样的,你说的 python 和 node.js 都是兼顾开发和运行依赖的。
C 系的依赖管理也没什么优雅的,同样混乱臃肿,只不过它最新的包管理系统穿了个马甲你就不认识了,叫做 Docker |
![]() |
32
chengyiqun 20 小时 35 分钟前
@dcoder #24 我是说给没有 python 环境的服务器导出一份包含完整解释器的环境, conda 的环境是包含完整解释器的, uv 的是软链接
|
33
dcsuibian 20 小时 22 分钟前 ![]() 因为 Node.js 和 npm 作者太菜了呗,抄都不会抄
C#我不知道就不说了。反正 npm 给 Maven 提鞋都不配,属于屎中屎 1 、本地统一中央仓库。存储空间我倒感觉无所谓,但问题是速度。Maven 的一旦本地有依赖了,就不走网络请求了( SNAPSHOT 版除外)。速度差别极大,尤其是对于细碎小文件来说 2 、命名空间。Maven 的包名其实分了 groupId (域名反写)和 artifactId (模块名),即使模块名冲突,域名也不会。你再看看 npm 的包名抢注: https://v2ex.com/t/974118 。当初 left-pad 事件的导火索我记得就是 npm 的包名转移吧。 3 、审核机制,npm 曾经还被人拿来保存盗版视频: https://www.v2ex.com/t/1012222 4 、关于包的删除。https://stackoverflow.com/questions/9789611/removing-an-artifact-from-maven-central ,除非你有特殊情况联系 Sonatype 的审核,否则你是删不掉自己上传的包的。我真的很难想象是怎么发生 left-pad 这种事件的。 5 、语义化版本控制。属于说的很好,但完全没用的设计。最好的方法就是完全锁死版本,手动升级,保证构建稳定性。联系到 npm 投毒,就显得更垃圾了。 |
![]() |
34
Al0rid4l 20 小时 1 分钟前 ![]() 首先, 现在还在用 npm 的肯定都是业余兼职前端的, 十有八九都是后端在公司被迫兼职前端的, 那就别锐评了
其次, pnpm 没有每个项目都复制一遍依赖的问题. npm: Windows 可以复制 dll, 我不可以学习一下微软先进思想复制 node_modules? 另外, 哪怕是 npm 的几个 G 放现在根本算不上什么黑点, Nuget 依赖小, 但.NET 构建产物可不小, 我随便打开本地一个.NET 项目一看, 几百 M 到几个 G 的都很正常, Rust 项目下的随便几个 G 十几个 G 也没见人黑 最后, pnpm 就是这个星球最好的包管理器, 没有之一. .NET 吹下 C#语言啥的没问题, 但别吹 Nuget, 这玩意和优雅沾不上边, 黑前端黑点别的可以, 黑包管理也属于是黑不到点子上. 以前我也以为前端包管理非常 sb(但那时我都已经在用 pnpm 了), 直到我看了其他家都是怎么做的, 才发现原来都是残疾人, pnpm 真香. 以 Nuget 为例, 2018 年才整出个 lockfile 这种连 npm 都玩剩下的东西, 结果到现在还没几个人用. 总是听前端扯什么幽灵依赖菱形依赖的, 我看看 Nuget 菱形依赖怎么解? 一看解析个最低版本依赖只保留一份我差点昏了过去, 合着原来你们都不解决的啊, 不解决就等于没有问题, 天才, 以至于现在我都是用 paket 做包管理了(但 paket 也有它的问题). 区分 dev 依赖和 runtime 依赖吗? 不区分, 当然你要说能通过 PrivateAssets 和 ReferenceOutputAssembly 控制那勉强也算有吧. 文档, 都说 MSDN 文档天下第一, 结果为了发个包去看 Nuget 的文档发现好几份, 我随手一翻 https://learn.microsoft.com/zh-cn/nuget/what-is-nuget, https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-nuget-config-get, https://learn.microsoft.com/en-us/nuget/nuget-org/publish-a-package MSBuild, 这玩意的文档更是散落在 MSBuild 的各个角落, 以前我觉得 webpack 工程师名不虚传, 后来发现 MSbuild 才是重量级 https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/compiler-options/language, https://learn.microsoft.com/zh-cn/dotnet/core/project-sdk/overview, https://learn.microsoft.com/en-us/dotnet/core/deploying/single-file/overview?tabs=cli, https://learn.microsoft.com/zh-cn/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2022, 它就不能把这些配置项写在一起, 以至于我专门为了 MSBuild 的配置整了个收藏夹目录作为手册方便查阅, 看完这些我都要成 MSBuild 配置仙人了 https://imgur.com/k9cA79s 补充一点参考资料 https://www.zhihu.com/question/36697792/answer/3575608392 https://www.zhihu.com/question/586423333 https://fsprojects.github.io/Paket/faq.html |
![]() |
35
maix27 19 小时 42 分钟前
你要是不会问问题就别问,C#的开发者总能把朋友搞得少少的,敌人搞得多多的。要都像你这样,C#啥时候才能出头呀?
|
36
thinkershare 19 小时 26 分钟前
@Al0rid4l Nuget 为什么需要 lockfile 这种垃圾玩意。
|
37
Donaldo 19 小时 17 分钟前
@wangtian2020 #10 我个人项目都上 G 了...大厂上 G 那不是家常便饭,大家都跑路?
|
![]() |
38
LitterGopher 19 小时 15 分钟前
所以为什么很少看见项目是使用 nuget install 之类的方式安装一些工具呢?
你看 go 有 go install, rust 有 cargo install, python 又 pip install, node 有 npm install, 不会是 C 艹艹做不到吧? |
39
thinkershare 19 小时 13 分钟前
@LitterGopher 你不知道是你菜比
|
![]() |
40
LitterGopher 19 小时 4 分钟前
@thinkershare #39 惭愧,确实是菜逼, 而且扣脚的那种.
但是实际情况确实是你在 GitHub 上找一些工具之类的(即便就是 C# 写的工具) 也很少有提供 nuget 进行安装的(也许有, 但我从来没有看到过, 见识浅薄) 也有可能也许这并非 C# 的舒适区, 如果不是的话, 那 neget 又怎么有能力对其他语言的包管理器指指点点呢? |
![]() |
41
thoo61871 19 小时 3 分钟前
怎么最近那么多吹 C 井的
|
![]() |
42
Al0rid4l 19 小时 1 分钟前 ![]() @thinkershare 为什么需要? 官方知道会有你这样的人来问, 所以已经给你回答了 https://devblogs.microsoft.com/nuget/enable-repeatable-package-restores-using-a-lock-file/#why-use-a-lock-file
|
![]() |
43
anzu 18 小时 39 分钟前
初始的 venv 并不大,我 python3.9 的 venv 只有十几 MB 。即使我安装了 opencv-python 和 numpy 也只有 185MB 。如果很大,你需要用 pip list 检查一下是否安装了多余的包。
python 的哲学就是 simple is better. venv 虚拟环境完全隔离,与其它的东西毫无关联。删除也是简单地删除文件。 |
![]() |
44
Al0rid4l 18 小时 27 分钟前 ![]() @LitterGopher 有的, 叫作 dotnet add 和 dotnet restore, 分别对应添加单个依赖和安装所有依赖, 不过后者通常不会用到, 因为 build 等非常多的命令会默认执行一次 restore 以至于基本上不会用到 restore 这个命令
还有一部分情况是, .NET 的人大多用 vs, 鼠标点点就装完了根本不知道有这些东西 |
![]() |
46
jqtmviyu 18 小时 20 分钟前
有了 uv, python 总算能用了. 之前的体验差 pnpm 太多.
现在还有个问题, 为啥还得自己激活 venv, 就不能配置自动激活吗? 把这串 `source $PWD/.venv/bin/activate` 加到 alias 或者用 direnv, 还是很不方便. |
![]() |
48
lambdaq 18 小时 11 分钟前
拿 C# 和 maven 对标的其实压根不懂
纯 py 代码没有任何依赖管理问题。你甚至直接把包复制到 PYTHONPATH 下就能跑。py 的依赖管理都是 .so 扩展导致的。 对应 C# 你需要解决的是 winsxs 那一堆 COM 接口的组件依赖问题 对饮 Java 是 JNI 。 我不觉得 C# / Java 解决了这个问题。 |
![]() |
49
UnluckyNinja 16 小时 59 分钟前 via Android
pnpm 和 bun 都是 hard link ,除了 ci 应该没人用 npm 来安装依赖了,这个问题有点“先问是不是,再问为什么”的问题
|
![]() |
51
guanzhangzhang 16 小时 31 分钟前
@ipwx 信创很多客户不能联网,还是静态编译好些,有 cve 了换二进制就行,不然就像升级 sshd openssl 把 glibc 搞崩了的
|
52
minottomie4383 16 小时 18 分钟前
别的不知道,OS 配置一下,鄙视链走起来
nixpkgs.overlays = [ (final: prev: builtins.listToAttrs (map (name: { inherit name; value = throw "FK ${name} !"; }) (builtins.filter (name: builtins.match "nodejs.*" name != null) (prev.lib.attrNames prev))) ) ]; |
53
harlen 15 小时 25 分钟前
@chengyiqun 打包用 nultka
|
55
mayli 15 小时 22 分钟前
之前 venv 的确是,现在 uv 用 hardlink ,明显少很多了。
nodejs py 问题是包管理器其实都是野生手搓,核心就是能用就行。 直到最近才出现一些比较优化的工具。 |
![]() |
56
chengyiqun 13 小时 14 分钟前
@harlen #53 是 Nuitka 不是 Nultka
|
57
LaTero 12 小时 18 分钟前 via Android
@Al0rid4l 微软文档是真的烂,不知道为什么国内这么多人吹。学 Unity 的时候查 C#的文档简直绝望,所有微软产品的文档都是一股脑塞在一起,根本猜不到想要的信息会被拆到哪个分类里,搜索也不能限定 C#,只能限定到 dotnet ,然后搜索结果全是什么 excel api 之类的。
|
58
kakki 10 小时 46 分钟前
吵起来了,我就想看这个,maven 的管理不知道高到哪里去了
|
![]() |
59
Trim21 10 小时 38 分钟前
不能理解 lockfile 的意义的就别参与包管理器话题了...
|