为什么 Python 、Node.js 就不能学习一下 C#这种优雅的依赖管理方式?

5 天前
drymonfidelia  drymonfidelia

node_modules 每个项目都有几个 GB ,这站里大部分都是前端,应该都懂,不用多说了

最近发现 Python 的 venv 也超大,并且比 Node.js 还离谱,每个项目的 venv 里都还会复制一遍 python 解析器

为什么就不能像.NET 的 NuGet 一样,把依赖都按版本放在一起?放在项目目录里,还要配置版本管理排除

NuGet 的包缓存目录里有版本号,不同依赖版本不会冲突

6168 次点击
所在节点   程序员  程序员
79 条回复
kzfile
kzfile
5 天前
非不为也,实不能也
a33291
a33291
5 天前
@wangtian2020 先不说 node_modules 大,就算 500 也不小了.大部分 c#的包以 nupkg 形式发布(实际上就一个压缩包),基本都是 kb 级别
nziu
nziu
5 天前
历史遗留问题,当初设计的时候就是凑合用能跑就行甚至都没有包管理。
dcoder
dcoder
5 天前
@samnya @chengyiqun
uv 靠链接的主要问题是什么? uv 里的 lock (with version+hash) 还是可以靠谱的重复 build 的.

@chengyiqun
还有, 你要打包成执行文件的话, 不是应该靠 pyinstaller 么?
如果只是导出执行环境的话, uv 的配置文件不比让 conda 打包环境更方便么?
encro
encro
5 天前
rye + uv 是非常好用的。

pnpm 也是非常好用的。

conda 也是非常 nice 的。
maocat
maocat
5 天前
看了 op 的历史帖子,原来是 c 艹艹的死忠啊
CyouYamato
CyouYamato
5 天前
看了眼正在写的三个 node.js 项目, 两个后端一个前端, 最多的一个是后端也没超过 500MB.好奇上 G 的都是什么重量级的项目?
ipwx
ipwx
5 天前
好几年前我也迷信过 static linking 、single binary executable ,觉得这样做个小工具给别人用很 cool 。觉得 python 拖一堆依赖库很麻烦。

现在嘛,面向工资编程了还管这个?依赖库大无所谓,写程序快就行 。
woniu7
woniu7
5 天前
我不喜欢 py 和 node 的原因之一就是这个,看来不是我只有我这么认为
觉得这两好的多用别的后端语言都能感觉到差距,生态成就了他们。
向来都是市场决定价值,只要不烂到不行,优秀的东西他没市场就是要凉,哎😮‍💨
来吧,冲我(引战
Subfire
Subfire
5 天前
Maven Gradle 这种就挺好, 去本地中央仓库里自取需要的版本
nomagick
nomagick
5 天前
首先开发依赖和运行依赖是不一样的,你说的 python 和 node.js 都是兼顾开发和运行依赖的。

C 系的依赖管理也没什么优雅的,同样混乱臃肿,只不过它最新的包管理系统穿了个马甲你就不认识了,叫做 Docker
chengyiqun
chengyiqun
5 天前
@dcoder #24 我是说给没有 python 环境的服务器导出一份包含完整解释器的环境, conda 的环境是包含完整解释器的, uv 的是软链接
dcsuibian
dcsuibian
5 天前
因为 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 投毒,就显得更垃圾了。
Al0rid4l
Al0rid4l
5 天前
首先, 现在还在用 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
maix27
5 天前
你要是不会问问题就别问,C#的开发者总能把朋友搞得少少的,敌人搞得多多的。要都像你这样,C#啥时候才能出头呀?
thinkershare
5 天前
@Al0rid4l Nuget 为什么需要 lockfile 这种垃圾玩意。
Donaldo
5 天前
@wangtian2020 #10 我个人项目都上 G 了...大厂上 G 那不是家常便饭,大家都跑路?
LitterGopher
5 天前
所以为什么很少看见项目是使用 nuget install 之类的方式安装一些工具呢?

你看 go 有 go install, rust 有 cargo install, python 又 pip install, node 有 npm install, 不会是 C 艹艹做不到吧?
thinkershare
5 天前
@LitterGopher 你不知道是你菜比
LitterGopher
5 天前
@thinkershare #39 惭愧,确实是菜逼, 而且扣脚的那种.

但是实际情况确实是你在 GitHub 上找一些工具之类的(即便就是 C# 写的工具) 也很少有提供 nuget 进行安装的(也许有, 但我从来没有看到过, 见识浅薄)

也有可能也许这并非 C# 的舒适区, 如果不是的话, 那 neget 又怎么有能力对其他语言的包管理器指指点点呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1120003

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX