Windows 安装软件需要 installer 而 MacOS只是用户拖一下进行确认即可。
gaowanlu@gaowanludeMacBook-Pro /Applications % ls
Brave Browser.app Keynote Creator Studio.app Numbers Creator Studio.app TestFlight.app Xcode.app
Docker.app Longbridge.app Pages Creator Studio.app Utilities iKuuuVPN.app
Godot.app NeteaseMusic.app Safari.app Visual Studio Code.app
gaowanlu@gaowanludeMacBook-Pro /Applications % 在 Finder 中点这些 app 图标可以打开应用,在终端中可以进入查看这些文件夹。
gaowanlu@gaowanludeMacBook-Pro Contents % ls -a
. Info.plist MacOS Resources embedded.provisionprofile
.. Library PkgInfo _CodeSignature
gaowanlu@gaowanludeMacBook-Pro Contents % pwd
/Applications/Docker.app/Contents在类 Unix 系统中,启动一个程序通常涉及两个重要的系统调用。
fork 通过克隆父进程创建一个新的子进程。子进程调用 execv 将该子进程替换为一个新的可执行程序,
这些 app 结尾的文件夹是应用包,发布应用时不仅仅只是发布可执行文件,还需要如 图标 等等以及其他文件内容 动态库 默认配置文件 插件 框架 本地化文件 资源。
图标显示 不同系统 都不同。
macOS app包下的 Contents 下的 Info.plist,里面有告诉 可执行文件在哪,以及 应用 ICON,会告诉操作系统许多它需要了解的有关该应用的信息。
当安装应用,拖拽到 Applications 文件夹,不仅仅是拖拽了一个图标,是在拖拽整个软件包。一个应用程序和操作系统所需资源的目录 已使应用程序在桌面环境中按预期显示和运行。
这种抽象是 Finder 和 桌面 搞的,和内核无关,是用户空间程序。
gaowanlu@gaowanludeMacBook-Pro /Applications % open Longbridge.app 终端中可以使用 open 运行应用包程序。
Windows 其实也有类似的 Applications 文件夹,一般在 C 盘的 Program Files 和 Program Files(x86)。
打开就可以看到乱七八糟的文件夹,不像 macOS 那样搞成了 app 包 很整洁。
里面可能会找到 exe 文件,macOS 把 应用元数据信息 放到了 Info.plist,而 Windows 把 图标 名称 版本号 啥都塞到了 exe 文件里。
Windows 系统中很多系统级应用程序配置都存储在称为 Windows 注册表的东西中。 它基本是一个集中式数据库,供操作系统和应用程序使用。 该数据库帮助 Windos 跟踪已经安装的 应用程序、卸载信息、文件关联、 默认程序、上下文菜单项、应用程序路径以及许多其他系统集成部分。 Windows 期望所有这些信息都存储在注册表中。
这就是 Windows 应用程序通常使用 Installer 的主要原因之一,要改注册表。 在 ProgramFiles 创建新文件夹,把自己的东西拷到文件夹里,然后更新注册表。
Linux 就比较特殊了,毕竟 Linux is not an Operating System, it is a Kernel.
请记住内核并不关心已安装的应用,桌面环境 你可以用 GNOME、KDE、XFCE 等。
那么多发行版,很好的是 大家通常都遵循 XDG Desktop Entry specification。
Linux 真正的噩梦不是桌面入口,而是 发行方式,有不同的软件包管理器、不同的软件包格式, 以及数不胜数的大包应用程序的方法。
Traditional distro-native packages(发行版原生软件包)
针对特定发行版的包格式。
通过发行版的软件包管理器安装。
文件会安装到
/usr/bin、/usr/lib、/usr/share
等标准目录。
示例:
.deb.rpm.pkg.tar.apk.ebuildUniversal / cross-distro app formats(跨发行版通用格式)
一个包可运行于多个 Linux 发行版。
不依赖各发行版自己的打包方式。
示例:
Repository-based installation(软件仓库安装)
Linux 最常见的安装方式。
通过仓库下载、自动解决依赖并安装。
示例:
Source-based distribution(源码分发)
发布源码或构建脚本。
用户本地编译后安装。
示例:
Portable binary archives(便携二进制压缩包)
发布压缩包。
解压即可运行。
示例:
.tar.gz.tar.xz.zipLanguage-specific package managers(语言包管理器)
针对某种编程语言。
多用于开发工具和库。
示例:
Container-based distribution(容器分发)
应用作为容器镜像发布,而不是安装到宿主机。
常用于服务器、数据库、开发环境。
示例:
Installer scripts(安装脚本)
install.sh
curl ... | shManual installation into /opt(手动安装到 /opt)
/opt。/opt/AppName