V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ac169
V2EX  ›  macOS

macOS 开发环境搭建的系列问题

  •  
  •   ac169 · 2023-07-12 18:14:01 +08:00 · 3570 次点击
    这是一个创建于 500 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 背景介绍:

    平常都是使用 Windows 和 Linux, 现需要开发一个移动端 APP ,为了方便 Android 和 IOS 同时开发,决定在 macOS 上搭建开发环境,目前操作系统版本:macOS Catalina 10.15.7,刚接触 macOS 并且能又是做开发使用,所以有很多问题不解,希望大家指教!

    • 安装路径:

    虽然 APP 和 PKG 包都有默认安装路径,那么其他形式的二进制包放到什么目录比较规范?目前比较多的就是放到用户主目录下的某个位置,但这样放其他用户使用上不太方便有的还有权限问题且感觉很恼火;如果是放到根目录下的 Library 目录又有权限问题,比如:Android SDK 如果你不开写权限那么更新操作又有问题,如果开了,系统加环境变量后又提示这个目录有隐患。

    • 卸载问题: macOS 没有自带卸载工具吗(类似 Windows 控制面板 -> 程序和功能这种)
    • APP 包都说直接移到废纸篓就可以了,但有没有文件残余问题,如何清理?
    • PKG 包如何卸载?系统好像有一个 pkgutil 命令行的工具但是好像没有完整的卸载功能,需要通过其他 APP 或者脚本来实现,感觉很恼火!
    • 环境变量:

    目前常见的都是将变量写入 ~/.zsrc 或 ~/.bashrc 文件的形式配置用户级环境变量的方法,有方法能配置系统级(所有用户都生效的)环境变量吗?有方法说将变量写入 /etc/profile 或 /etc/path 文件,但文件有保护无法写入。

    • 包管理器: macOS 除了 Homebrew 还有其他类似的包管理器吗?
    • 即使通过环境变量配置了国内源镜像 brew ,但是安装过程中还是有很多跳转到 github.com 造成安装失败,如果这个时候使用代理国内源又无法使用,这个问题如何破?
    • brew 感觉一味的安装新版本,不能针对系统版本来安装相应的版本(比如:brew install ruby 目前安装是最新 1.17.0 ,而这个版本 10.15.x 已经不支持),而指定版本方法又非常曲折(到 github 下载相应版本 rb 文件来安装)。当然对于新系统可能不存在问题但对于版本老一点的系统就是问题了,本身 brew 下载就慢结果搞半天还是错的,恼火!
    40 条回复    2023-07-17 10:32:57 +08:00
    pc10300
        1
    pc10300  
       2023-07-12 18:31:50 +08:00
    1 、系统版本:其实 10.15 已经很老了,后面经历了 11 ,12 ,13 三个大版本。
    2 、安装路径问题:App 就放在/Applications 这个文件夹就好了。
    3 、应该是没有,可以用一些第三方工具清理卸载残留或者在网上找命令删除残留,推荐找一些免费的清理工具。
    4 、环境变量这个没有太了解过,因为我一般只用一个用户,在 linux 上面一般会直接用 root 。
    5 、homebrew 的问题: 我没记错 brew 是支持安装指定版本的,不需要去 github 下载吧。
    最后,有个小疑问:干这行的上 github 还会很困难吗。
    pc10300
        2
    pc10300  
       2023-07-12 18:33:43 +08:00
    @pc10300 我也是小白,如果有误导,希望大佬可以帮我指正
    deplivesb
        3
    deplivesb  
       2023-07-12 18:45:12 +08:00
    1. 2023 年了就别用 Catalina 了太老了
    2. /usr/local/bin?
    3. 卸载一直就是移到废纸篓就行,实在不放心,下个 appcleaner ,pkg 的可以用 UninstallPKG
    4./etc
    deplivesb
        4
    deplivesb  
       2023-07-12 18:45:54 +08:00
    @deplivesb /etc profile 可以强制保存啊
    5. brew 可以安装旧版本
    ac169
        5
    ac169  
    OP
       2023-07-12 20:55:05 +08:00
    1. 现有系统小版本都特别标注的, 一般来讲都是有原因的, 比如 机器性能 版本一致性等考量!

    2. 这里重点是指 Android SDK 这种语言或者是平台开发环境, 所以个人觉得不适合 放在/Applications 或者 /usr/local/bin 这样的目录. 个人想过放在 /opt 这样的目录.

    3. 可能是前面描述有问题, 这里想表达的意思不是能不能找到相关的卸载 APP 和脚本, 我是想说的是官方这种单向 pkg 管理方式很不友好( low ), 至少其他两家系统没有这样操作.

    5. brew 不是不能安装旧版本, 而是默认都是安装新版本, 要安装指定版本很曲折或者说有很多前提, 比如: 如果 要使用 brew install 安装旧版本, 比如是要官方源有, 实时上很多软件官方源只有一个新版本, 没有 ***@*.*.* 这样的版本. 这个时候只能去找老版本或字定义 rb 文件来安装 ( 最后我就是采用的这种方式安装成功的 )



    @pc10300
    5. 上 github 问题不大, 问题是: 代理直接访问不一定能保证稳定, 特别是那种安装包大或依赖的包很多的情况, 一旦断了就重来. 如果使用国内源切换, 但是有的包(估计是镜像中没有)最后又访问了 github, 这个时候就又回到了原点! 你设置代理吧, 国内源很多时候拒绝代理访问.


    @deplivesb
    4. 至少在我用的这个系统版本上无法强制保存,哪怕是用 sudo 来编辑. 最后提示 *** read only ***, 据说是 SIP 的问题!
    paopaosa
        6
    paopaosa  
       2023-07-12 21:23:33 +08:00
    请用 Monterey 以上的版本。
    ShadowPower
        7
    ShadowPower  
       2023-07-12 23:06:11 +08:00
    背景介绍:
    1. 做 iOS 开发应该保持最新的稳定版,因为 Xcode 和系统版本绑死,旧版 macOS 只能用旧版 Xcode ,用旧版 Xcode 编译的应用不能上架

    安装路径:
    2. 其实 macOS 的多用户有 bug ,不需要考虑多用户使用的情况

    卸载问题:
    3. 卸载有残留,软件的配置和用户数据都不会在软件包目录下。因为升级的时候会完整替换整个文件夹,为了避免丢失配置和数据,没有软件会做成数据跟 APP 包一起,拖进废纸篓就删干净。可以用 http://freemacsoft.net/appcleaner/ 这款软件,卸载时能顺便删除一些常见路径下的文件

    4. 除非软件自己实现了卸载,否则 PKG 包没有卸载方式。直接谷歌搜索“软件名 uninstall”,根据搜到的资料手动删除文件

    环境变量:
    5. macOS 没有全局环境变量

    包管理器:
    6. 无解,我觉得 homebrew 只能凑合用,比没有包管理器好。不能奢求好用
    YsHaNg
        8
    YsHaNg  
       2023-07-12 23:12:42 +08:00   ❤️ 1
    卸载清理可以 homebrew cask zap
    Xusually
        9
    Xusually  
       2023-07-12 23:16:43 +08:00 via iPhone
    这系统太旧了 没办法用新版 xcode ,做 ios 这块有问题
    cnhongwei
        10
    cnhongwei  
       2023-07-13 00:20:38 +08:00
    1. catalina 有点旧,看看能安装新版的 xcode 不,appstore 上架对 xcode 有版本要求
    2. 使用默认安装路径就好了。
    3. 使用 brew 安装的东西,使用 --zap 参数卸载能清理文件残余,如果是其它方式安装的,只能使用清理工具或手工清理。一般都是把文件放 home 的 Library 或 home 的.xxx 目录中。有一些软件会安装一些文件到系统目录,这个就不好清理了,所以最好使用 brew 安装。
    4. 你系统不使用多用户,没有必要放到系统环境中。如果要放,使用 sudo vi 来修改
    5. 有其它的包管理,但我没有用过,感觉 brew 对我来说够用了。不能访问 github 是比较麻烦一些,所以最好搞好自己的网络,反正我现在使用 baidu 的话,感觉就不会编程了。brew 安装旧版本,如果是 java 之类的软件,有 java8 java17 之类的包,如果是其它一些没有这样分版本的软件,使用 versons tap 看看,大部分对版本要求严格的软件都有旧版本。
    loveumozart
        11
    loveumozart  
       2023-07-13 01:05:16 +08:00
    ios 开发肯定用不了 catalina 的啦,版本太旧新版本模拟器都跑不了
    luvmhx
        12
    luvmhx  
       2023-07-13 04:26:25 +08:00   ❤️ 2
    @pc10300 在 linux 上到处用 root......愿主保佑你,阿门
    murmur
        13
    murmur  
       2023-07-13 08:00:21 +08:00
    我也吐槽过 brew 的问题,基本上 brew 装玩 pod 剩下的就跟他没关了,体验还得看梯子
    2NUT
        14
    2NUT  
       2023-07-13 08:25:59 +08:00
    软件卸载功能是缺失的,因为 苹果 假定你的主要 app 来源是官方应用商店
    iamqk
        15
    iamqk  
       2023-07-13 08:49:54 +08:00
    iOS 开发需要用比较新的 Xcode ,xcode 又需要用比较新的 macOS
    具体需要哪个 xcode 版本请参照 iOS 开发指南
    具体 xcode 需要哪个 macOS 版本请参照 Xcode 的 release note
    pc10300
        16
    pc10300  
       2023-07-13 09:05:59 +08:00
    @luvmhx 反正都是自己玩的,也不会在生产环境用
    8355
        17
    8355  
       2023-07-13 09:10:21 +08:00   ❤️ 2
    我们都用 Ventura 都用 Monterey 你用 Catalina 可能没资格来用 brew 喔
    2NUT
        18
    2NUT  
       2023-07-13 10:04:03 +08:00
    @8355 虽然是梗,但确是真的,brew 好像只支持最近几个大版本
    2NUT
        19
    2NUT  
       2023-07-13 10:04:24 +08:00
    @murmur macos 需要更好的 软件包管理
    kingzeus
        20
    kingzeus  
       2023-07-13 10:24:01 +08:00
    2 ,安装路径:苹果推荐的是 app 包,存放在/Applicaions 下,其他的可以参考 Linux
    3 ,卸载:一般是删了 app 就可以了,还是不放心的装几个安装管理的应用就好了
    4 ,环境变量:使用 app 的话,一般不需要处理这个,其他的话,参考 Linux
    5 ,Homebrw:支持各种版本安装,大部分软件的版本都很全,文档很详细,仔细阅读下就可以了

    另外的建议:
    1. 开发应用,可以照着苹果的文档走,几乎全部的需求苹果都考虑到了
    2. 如果想自己折腾的话,可以参考 Linux 开发
    3. 仔细阅读文档能解决大部分的问题,以及足够新手上路
    4. 作为程序员,善用搜索引擎和 chtgpt
    ac169
        21
    ac169  
    OP
       2023-07-13 13:19:54 +08:00
    @loveumozart
    @iamqk
    @Xusually

    为什么用老系统版本 我在 #5 提及过, 其中一个原因就是现有机器比较老了, 装新版本非常卡才降级回来的! 而 10.11.x 很流畅, 现在升级 10.15.7 感觉上都有点卡了, 为什么不换机器这些问题我觉得就不要讨论了.

    本身 APP 功能很简单(实话说复杂功能 ios 也不一定支持), 不是说非要新 xcode 和新系统才能开发出来, 所以首要是要保证大部分工作效率, 至于老版本上架有问题到时候可以单独找一个新版本机器临时用用或者说升级到新版本来做上架适配,卡就卡点, 这个时候工作量也不多了, 这样的思路不行吗?
    ac169
        22
    ac169  
    OP
       2023-07-13 13:25:13 +08:00
    @kingzeus

    3.
    5.

    这个问题 在后续的 #5 中有提及就不赘述了.
    8355
        23
    8355  
       2023-07-13 13:41:33 +08:00
    @2NUT #18 用不了 2 3 年 intel 系的 cpu 都可能不支持了 就是这么真实。
    iamqk
        24
    iamqk  
       2023-07-13 13:42:41 +08:00
    @ac169
    你用旧 Xcode ,就只能用旧的接口
    1 新的接口和开发特性(比如最新的 swift5.8 之类的)以及 SDK 无法使用
    2 旧的接口可能在新的环境中已经被弃用 无法编译通过等。

    你这样软件简单还好说,软件复杂的话,上线前得不停的做修改,而且不能保持,因为修改后新版的代码也不支持在旧版 xcode 上跑。再次上架还得再来一次,可能得不偿失。
    ac169
        25
    ac169  
    OP
       2023-07-13 14:11:00 +08:00
    @iamqk

    2.

    xcode 12.x -> xcode 14.x

    iOS 14.4 -> iOS 16.0
    Swift 5.3.2 -> Swift 5.7

    支持的接口( UI 和 基本 io 方面)变化很大吗, 从那里可以看到这些变化?

    个人觉得, 大多 app 开发无非就是写个界面和使用用一些基本的 io 接口!
    iamqk
        26
    iamqk  
       2023-07-13 14:31:22 +08:00
    @ac169 我反正把我的经验都告诉给你了,你估量着自己处理吧
    ac169
        27
    ac169  
    OP
       2023-07-13 15:00:01 +08:00
    @iamqk 新特性可以不考虑,但接口变化这个问题肯定要考虑,特别是 UI 基本网络和文件 IO 方面 . 开始的意思是官方文档有没有具体介绍的, 还是这些变化只能自己摸索.
    YsHaNg
        28
    YsHaNg  
       2023-07-13 18:44:17 +08:00
    @cnhongwei zap 加 force 可以清理其他方式安装的配置文件
    YsHaNg
        29
    YsHaNg  
       2023-07-13 18:47:53 +08:00
    @ac169 ui 和 io 正好是这几个版本变化相当大的地方 如果想上架可能是不得不考虑放弃 10.15
    ac169
        30
    ac169  
    OP
       2023-07-13 19:22:12 +08:00
    @YsHaNg 官方有详细的说明文档吗? 或能否用几个常用的接口和函数举例一下!
    ac169
        31
    ac169  
    OP
       2023-07-13 19:55:26 +08:00
    15

    Deprecations
    supportedPhotoPixelFormatTypes(for:) and supportedRawPhotoPixelFormatTypes(for:) now return [OSType] instead of [NSNumber] in Swift. (64822071)

    recommendedVideoSettings(forVideoCodecType:assetWriterOutputFileType:) now returns nullable NSDictionary<NSString *, id> * instead of nullable NSDictionary * in Objective-C and [String: Any]? instead of [AnyHashable: Any]? in Swift. (33784279)

    cgImageRepresentation() and previewCGImageRepresentation() now return CGImage? instead of Unmanaged<CGImage>? in Swift. (44734827)

    recommendedAudioSettingsForAssetWriter(writingTo:) now returns nullable NSDictionary<NSString *, id> * instead of nullable NSDictionary * in Objective-C and [String: Any]? instead of [AnyHashable: Any]? in Swift. (50450334)




    15.4

    Deprecations
    Some extensions in std::tuple were removed to fix bugs caused by those extensions:

    Tuples can no longer be constructed from fewer than the number of elements in the tuple. Previously, elements that weren’t specified were default-constructed; now this is a compiler error.

    A tuple can no longer be constructed from an array.

    The std::result_of and std::is_literal_type type traits are no longer available in C++20 mode, as specified in the Standard.




    16

    Deprecations
    To improve security, CGImageCreate enforces parameter correctness on macOS 13 Ventura, iOS 16, iPadOS 16, watchOS 9, and tvOS 16. Passing an incorrect CGImageByteOrderInfo is no longer supported, and will result in images failing to load. (94855401)




    16.2

    Deprecations
    In order to improve compiler type-checking performance, we’ve deprecated some Table initializers. They’re replaced with initializers which require an additional parameter that explicitly specifies the type they generate their contents from. This improves type-check performance by avoiding the need to infer a shared type from the bodies of separate closure parameters. For now, these initializers are deprecated. In a future release, those deprecation warnings will become errors. The new initializers add the parameter of:.

    The new initializers add the parameter of:. The following shows a Table before, and after adoption of the new API:




    16.4 https://developer.apple.com/documentation/ios-ipados-release-notes/ios-ipados-16_4-release-notes#Deprecations

    Core ML
    Deprecations
    Core ML Model Deployment is being deprecated. Consider using Background Assets or NSURLSession instead. (102993813)

    Core Telephony
    Deprecations
    CTCarrier, a deprecated API, returns static values for apps that are built with the iOS 16.4 SDK or later. (76283818)

    Deprecations
    TimelineView initializers that pass an instance of TimelineView<_, _>.Context into its content closure have been deprecated in this release, and replaced with equivalent versions that pass an instance of TimelineViewDefaultContext instead.




    17 beta 3

    Audio Codecs
    Deprecations

    The QDesign audio codecs (qdmc & qdm2) and Qualcomm PureVoice audio codecs (qclp & qclq) are no longer supported. (82414419)(82414419)




    @YsHaNg 由于本身 12.15.7 xcode 12.4 对 14 大部分支持, 所以我直接从 15 开始找 一直到 17, 这个就是我找到的结果 这个对吗?
    YsHaNg
        32
    YsHaNg  
       2023-07-13 22:30:33 +08:00
    @ac169 yep 这也是我目前看到的 不是 ios 开发者 了解有限 但根据历年 wwdc 博客 应该还有很多 swiftui objc 相关 framework 改动 甚至包括 kalloc_type 的兼容
    ihwbunny
        33
    ihwbunny  
       2023-07-14 09:46:25 +08:00
    安装路径,可以在/usr/local/或者在 app 里面
    环境变量:旧版本的 SIP 有问题,/etc/profile, /etc/zprofile, /etc/zshrc 等都改 root 可写,而且新版 macOS 的新账户默认使用 zsh 了
    要是开发多用户的,运行时进行初始设置,一般无需设置全局的,如果需要,用 plist 设置,最好不直接全局/etc 中修改。
    ac169
        34
    ac169  
    OP
       2023-07-14 12:15:45 +08:00
    @ihwbunny

    谢谢, 其实关于环境问题我还有一个问题,就是优先级的问题! ~/.bashrc ~/.bash_profile ~/.zsrc ~/.bashrc ... 可以配置用户级的变量的文件都是五花八门, 到底配置那个 比如: 我看有个介绍就说 ~/.bash_profile > ~/.zsrc 或 ~/.bashrc 只有当 bash_profile 文件不存在的时候 才会调用, ~/.bash_profile 调用料 ~/.profile 但我实际配置这个文件 没有什么用 每次还是得 source 一次 , 如果配置在 ~/.zsrc 或 ~/.bashrc 就没有问题
    murmur
        35
    murmur  
       2023-07-14 12:54:41 +08:00
    @ac169 非常大,我们升级到 14 ,x 之后程序基本废了,本来就是一堆老的社区组件,结果新版一大堆 c++编译报错,以前的 warning 成 error ,改不动了
    ac169
        36
    ac169  
    OP
       2023-07-14 18:06:33 +08:00
    @murmur

    macOS Catalina 10.15.7 最高支持 Xcode 12.4 而 Xcode 12.4 SDK 已经可以到 macOS 11.1 (20C63)* iOS 14.4 (18D46)* watchOS 7.2 (18S561)* tvOS 14.3 (18K559) , 既然是新项目肯定是以这个为起点, 结合实际来说也就是我只需要考虑 iOS 14.4 -> iOS 16.0 这其中有没有大的变化就可以了, 而这个区别我找了一下区别 在 #31 中列出了, 整个根本性的变化并不多, 再说我还不一定用得上相应的东西, 不知道我的这个理解是否正确?
    ihwbunny
        37
    ihwbunny  
       2023-07-15 10:35:04 +08:00
    @ac169

    zsh 的:man zsh, 和参考: https://zsh.sourceforge.io/Doc/Release/Files.html#Startup_002fShutdown-Fileshttps://scriptingosx.com/2019/06/moving-to-zsh/

    bash 的首先要看启动方式,是 login ,是 interactive ,还是非 interactive
    login shell 的话,是/etc/profile, ~/.bash_profile, ~/.bash_login, and ~/.profile
    interactive 的看 ~/.bashrc
    非 interactive, 会看 BASH_ENV
    运行 scripts 的时候 要看/etc/profile and ~/.profile
    remote 的话,看 ~/.bashrc
    主要是看 man bash
    ac169
        38
    ac169  
    OP
       2023-07-15 11:05:18 +08:00
    @ihwbunny 谢谢!
    garibellee
        39
    garibellee  
       2023-07-17 09:18:23 +08:00
    brew 也遇到过类似问题,svn->1.14.2 支持 openssl3 但是老项目 svn server 不支持 openssl3 ,搞了半天也是找了 rb 才搞定
    sjgsgxsfsl
        40
    sjgsgxsfsl  
       2023-07-17 10:32:57 +08:00
    除了 homebrew 还有 macports ( https://www.macports.org)

    install 之前可以先 search
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2802 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 13:59 · PVG 21:59 · LAX 05:59 · JFK 08:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.