阅读视图

发现新文章,点击刷新页面。

苹果发布两款新 MacBook:AI 性能破纪录,最强显示器卖两万五

正如期待那样,苹果刚刚通过「官网直接上架」+「新闻稿」的方式,推出了最新的 M5 Pro/Max 款 MacBook Pro 和一大堆 Mac 更新。

这次上新的 MacBook Pro 相比昨天发布的「闹人」iPhone 17e,让人兴奋的元素少了一些。

毕竟它和爱范儿去年测试过的 M5 MacBook Pro 的唯一区别,就是处理器新增了 M5 Pro 和 M5 Max 两种规格,除此之外再无变化

▲ 图|Apple

而这次的 M5 Pro 与 M5 Max 处理器,的确有一些可以让人刮目相看的资质。

M5 Pro/Max 相比标准版 M5,差异最大的自然是核心数量。

根据爱范儿去年基于标准版 M5 处理器的评测,哪怕仅仅 10+10 核心的 M5,在很多追求本地算力的应用中已经可以追平当年的「巨无霸」M1 Max 了。

而规模更大的 M5 Pro 与 M5 Max,毫无疑问将会成为 2026 年 Mac 家族中的性能标杆。

目前我们看到,M5 Pro 的起步配置为 15 核 CPU + 16 核 GPU,最高可选配 18 核 CPU + 20 核 GPU 的组合:

而 M5 Max 的核心配置则来到了 18 核 CPU + 32 核 GPU 起步、18 核 CPU + 40 核 GPU 封顶的规模。

鉴于本次 N3P 工艺的进步,双端性能再创新高不是梦:

同时,本次 M5 家族的神经网络加速器规模同样不容小觑。

去年的标准版 M5 上,苹果就为每颗 GPU 核心都内置了「新一代神经网络加速器」,让 Msty Studio 和 VidHex 之类本地 AI 工具取得了不俗的效果:

▲ 在 Msty Studio 中使用相同指令测试首词元响应速度

而相同的神经网络加速器应用到 M5 Pro 与 M5 Max 规模更加庞大的 GPU 核心之后,其在本地机器学习和 AI 加速方面的表现只会更加出色——

根据苹果的介绍,M5 Pro 在 LLM 提示词中「相比 M1 Pro 可以实现 6.9 倍的提升」,M5 Max 则相比 M1 Max 实现了 6.6 倍的飞跃:

同时我们也能看到,在代码编译场景下,M5 Pro 不仅相比 M1 有接近 2.5 倍的提升,其表现甚至比 M4 Pro 都有了约 25% 的进步:

这种进步幅度可不是单纯堆砌 GPU 规模或者盲目提频能够实现的,台积电 N3P 工艺和改良过的架构设计在其中都功不可没。

同时,今年的 M5 Pro/Max 上还首次应用了一套「全新融合架构」,可以「将两颗芯片集成到单个 Soc 中」——

不出意料的话,这就是此前爆料中提到过的台积电 SoIC-MH 工艺,让不同架构的处理器单元可以更灵活地在晶片上排布。

MacBook Air:提速!

此外,本次处理器升级的不止 MacBook Pro,大半年没有更新的 MacBook Air 终于迎来了处理器升级。

按照计划,MacBook Air 从 M4 升级到了 M5,有 10+8 核与 10+10 核两种规模,依然为 16、24 和 32GB 三款内存:

最重要的好消息在于,这一代 MacBook Air 的硬盘起步配置来到了 512GB,价格 8499 元起(13 寸)。

并且过去几年「硬盘掉速」的问题终于得到了苹果的重视,根据官网上的说法,新版 MacBook Air 换用了新的 SSD,读写速度提升了两倍。

苹果显示器:影分身!

整整五年没更新的 Studio Display 终于在这个春天得到了新生,并且还夺舍了自家大哥 Pro Display XDR——

是的,你没看错,Pro Display XDR 没有了,现在官网只剩下 Studio Display 和 Studio Display XDR:

与预测的相同,新款用上了之前 CES 上 LG 展示的那块高刷 5K 面板(或类似物),让 Studio Display XDR 解锁了 ProMotion 能力。

只不过等级森严的传统不能丢,虽然 Studio Display XDR 更新了 120Hz 刷新率,但新 Studio Display 依然是 60Hz。

但 5K 120Hz 绝不是个轻松的参数,以至于苹果官网自己都要标明:

搭载 M1、M1 Pro、M1 Max、M1 Ultra、M2 和 M3 芯片的 Mac 机型搭配 Studio Display XDR 使用时,刷新率最高达 60Hz 。

而在软件方面,Studio Display XDR 还带来了一样新东西:DICOM 医学影像校准。根据官网的介绍:

Apple 发布了全新的 DICOM 医学影像预设和医学影像校准器,使放射科医生能够直接在 Studio Display XDR 上查看诊断图像,为单一用途的医学影像显示器提供了一种多功能替代方案,并支持无缝显示模式切换。

还记得医院墙上那个用来看 CT 的背光板吗?现在 Studio Display XDR 可以借助自己 2000 尼特的峰值 HDR 亮度来给医生帮忙了:

新版 Studio Display XDR 和 Studio Display 的起售价分别为 24,999 元和 11,999 元。

存储价格:还得涨!

对于 2026 年那个逃不开的话题,新 Mac 产品家族的各项存储规格也值得大家更密切的关注。

以最具代表性的 MacBook Pro 来说,本次 M5 Pro/Max 处理器依然提供 24、36、48、64、128GB 共五种可选的内存规格。

但与上代的 M4 Pro/Max 面临的问题一样,M5 Pro/Max 的内存依然是严重「叉着卖」的。

换句话说,基础 15+16 核心的 M5 Pro 只有 24 和 48GB 两种规格可选。想要升级到 36GB 内存,就必须加 2000 元选择 18+20 核心的才行。

为了让大家看得更直观,我们制作了这个对照表来帮大家理解:

相比劈叉的统一内存,新 MacBook Pro 的硬盘反而单纯了许多,还是熟悉的 1TB、2TB、4TB、8TB 组合,以前的 512GB 选项被取消了:

苹果或许能够在体量相对比较小的 iPhone 17e 上「加量不加价」。但对于 512GB 起步、8TB 封顶的 MacBook Pro 来说,存储价格压力依然不容小觑。

比较好玩的是,目前苹果官网的预购页面上,仍然提供 Final Cut Pro 与 Logic Pro 的买断制选项。

在顶上,苹果只用一行不起眼的小字列出了 Apple Creator Studio 服务:

▲ 图|Apple

需要注意:根据苹果此前的说法,通过 ACS 订阅的那些工具软件(包括创意工具和 iWork 三件套)和此前买断的版本,后续在功能性和 AI 能力上会产生版本差异。

如果你计划后面三五年都持续使用苹果创意全家桶的话,还是直接订阅 Apple Creator Studio 更省事一些。

▲ 图|Apple

考虑到 M5 Pro 和 M5 Max 是眼下整条 Mac 线中「无可争议的性能之巅」,对于那些需要 MacBook Pro 出外勤去现场剪辑、临时编译、移动调色的「prosumer」来说,这个价格相比之前其实没什么大区别

也应了爱范儿之前的选购建议:

明确需求,该买就买,买新不买旧。

毕竟 MacBook Pro 作为一款工具属性拉满的产品,对于大多数人来说,如果你买它不是为了挣钱的话,那么大概率是没有必要买的。

▲ 图|AppleInsider

同时记得关注爱范儿,我们将在后续为大家带来 M5 Pro/Max 款 MacBook Pro,以及本次苹果春季发布会上其他重点新品的完整评测。

#欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。

爱范儿 | 原文链接 · 查看评论 · 新浪微博


HarmonyOS 开发必会 5 种 Builder 详解

HarmonyOS 开发必会 5 种 Builder 详解,建议收藏

万少:华为HDE、鸿蒙极客

个人主页:blog.zbztb.cn/

2025年参与孵化了20+鸿蒙应用、技术文章300+、鸿蒙知识库用户500+、鸿蒙免费课程2套。

如果你也喜欢交流AI和鸿蒙技术,欢迎扣我。

前言

HarmonyOS应用开发中提供了众多的Builder用于实现结构复用,其中有**@Builder**、@LocalBuilder@BuilderParam

wrapBuildermutableBuilde等。

熟练掌握以上的Builder使用更加有利于开发出高质量的HarmonyOS应用。

@Builder装饰器

@Builder装饰器提供了最轻量级的组件结构复用,它不想自定义组件具有自己的生命周期和内部状态,所以运行起来体验和性能要更好,当需要在组件中实现结构复用时,优先使用它!

@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {
      this.MenuItem($r("sys.symbol.position"), "位置")
      this.MenuItem($r("sys.symbol.message"), "信息")
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }

  /**
   * @Builder 装饰器:用于定义一个轻量级的 UI 复用单元
   * 与 @Component 相比,@Builder 更适合简单的、可复用的 UI 片段
   * 该方法可以在 build() 方法中通过 this.MenuItem() 直接调用
   *
   * @param src - 图标资源,使用 Resource 类型支持系统符号或本地资源
   * @param text - 菜单项显示的文本内容
   */
  @Builder
  MenuItem(src: Resource, text: string) {
    Row() {
      SymbolGlyph(src) // 系统符号图标
      Text(text) // 显示的文本
    }
  }
}

效果如图所示。

转存失败,建议直接上传图片文件

@BuilderParam装饰器

@BuilderParam 用于声明一个UI 插槽,让父组件可以向子组件传递自定义的 UI 内容。

/**
 * 自定义组件 MenuItemChild
 * 演示 @BuilderParam 的使用 - 用于接收父组件传递的 UI 结构(类似于 Vue 的 slot 插槽)
 */
@ComponentV2
struct MenuItemChild {
  /**
   * @BuilderParam 装饰器:用于声明一个"插槽"属性,接收外部传入的 UI 构建函数
   * - 允许父组件向子组件传递自定义 UI 内容
   * - = this.defaultBuilder 表示设置默认值,当父组件不传递内容时使用
   * - 类型 () => void 表示一个无参数无返回值的构建函数
   */
  @BuilderParam
  slotBuilder: () => void = this.defaultBuilder

  /**
   * @Builder 装饰器:定义一个轻量级的 UI 构建函数
   * - 这里的 defaultBuilder 作为 @BuilderParam 的默认值
   * - 当父组件不传递 slot 内容时,显示此默认 UI
   */
  @Builder
  defaultBuilder() {
    // 默认结构:当父组件未传入自定义内容时显示
    Button("默认结构")
  }

  /**
   * build 方法:组件的 UI 构建入口
   * - 直接调用 slotBuilder() 来渲染传入或默认的 UI 内容
   */
  build() {
    this.slotBuilder()
  }
}


/**
 * 主页面组件
 * 演示 @BuilderParam 的使用方式:
 * 1. 传入自定义内容:MenuItemChild() { Button("父组件") } - 尾随闭包语法
 * 2. 不传入内容:MenuItemChild() - 使用默认的 defaultBuilder
 * 
 * @Entry 装饰器:标记此组件为应用入口页面
 * @ComponentV2 装饰器:标记此结构体为 UI 组件(V2 版本,性能更优)
 */
@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {

      // 方式1:通过尾随闭包向子组件传递自定义 UI(@BuilderParam 接收)
      MenuItemChild() {
        Button("父组件")
      }

      // 方式2:不传递内容,子组件使用 @BuilderParam 的默认值
      MenuItemChild()

    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }
}

效果如图。

@LocalBuilder装饰器

@LocalBuilder的作用和**@Builder**类似,都可以实现组件内的组件复用。但是两者存在区别

传递给子组件的参数中的 this 指向:

  • @Builder:指向子组件(this 上下文改变)
  • @LocalBuilder:指向父组件(this 上下文保持不变)
/**
 * 子组件:演示 @BuilderParam 接收外部传入的 UI 构建函数
 */
@ComponentV2
struct MenuItemChild {
  /**
   * @Local 装饰器:声明组件内的本地状态变量(V2 状态管理)
   */
  @Local title: string = "子组件"
  /**
   * @BuilderParam 装饰器:声明一个 UI 插槽属性
   * - 用于接收父组件传递的 @Builder@LocalBuilder 函数
   * - 必须由父组件提供值(无默认值时)
   */
  @BuilderParam
  slotBuilder: () => void

  build() {
    this.slotBuilder()
  }
}


@ComponentV2
@Entry
struct Index {
  @Local title: string = "父组件"

  @Builder
  MenuItem1() {
    Button(this.title) // 传递时捕获 title 的当前值
  }

  @LocalBuilder
  MenuItem2() {
    Button(this.title) // 始终引用最新的 title 值
  }

  build() {
    Column({ space: 10 }) {
      // 使用 @Builder this.MenuItem1 中的 this 指向的是 MenuItemChild组件
      MenuItemChild({ slotBuilder: this.MenuItem1 })

      // 使用 @LocalBuilder this.MenuItem2 中的 this 指向的是 当前的Index组件
      MenuItemChild({ slotBuilder: this.MenuItem2 })

    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
    .padding(10)
  }
}

效果如图。

wrapBuilder

@Builder存在一个缺陷:当@Builder方法赋值给变量或者数组后,在UI方法中无法使用。

如以下代码:

@Builder
function btn() {
  Button("按钮")
}

const builderArr: Function[] = [btn]

@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {
      ForEach(builderArr, (item: Function) => {
        item()// 错误:当@Builder方法赋值给变量或者数组后,在UI方法中无法使用。
      })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

wrapBuilder便是来解决这个问题的:

    1. 动态存储多个 @Builder 供运行时选择使用
    1. @Builder 作为参数传递给其他函数/组件
    1. 在循环、数组等场景中复用 @Builder
/**
 * 数据源:用于 ForEach 循环渲染时传递参数
 */
const titles = ["红牛", "康师傅", "小肥羊"]

/**
 * @Builder 函数:定义一个带参数的 UI 构建函数
 * @param text - 按钮显示的文本
 */
@Builder
function btn(text: string) {
  Button(text)
}


/**
 * wrapBuilder 函数详解
 * ─────────────────────────────────────────────────────────────────
 * 【作用】将全局 @Builder 函数包装成可复用的 WrappedBuilder 对象
 *
 * 【为什么需要 wrapBuilder?】
 * - @Builder 函数本身不能直接赋值给变量、不能放入数组、不能作为参数传递
 * - wrapBuilder 将其转换为普通的 JavaScript 对象,支持以上操作
 *
 * 【语法】
 * let 变量名: WrappedBuilder<[参数类型]> = wrapBuilder(builder函数名)
 *
 * 【本例用法】
 * - 将 wrapBuilder 返回的对象放入数组中存储
 * - 数组类型:WrappedBuilder<[string]>[] 表示存储多个包装后的 builder
 * - 每个元素都可以通过 .builder(参数) 调用原始的 @Builder
 *
 *
 * 【注意】
 * - 只能包装全局 @Builder,不能包装组件内的 @Builder
 * - 参数类型必须与 @Builder 函数签名完全匹配
 * ─────────────────────────────────────────────────────────────────
 */
let globalBuilder: WrappedBuilder<[string]>[] = [wrapBuilder(btn), wrapBuilder(btn)]; //可以放入数组

@ComponentV2
@Entry
struct Index {
  build() {
    Column({ space: 10 }) {
      /**
       * 遍历 globalBuilder 数组,调用每个 WrappedBuilder
       * - item: WrappedBuilder<[string]> - 包装后的 builder 对象
       * - item.builder(titles[index]) - 调用原始 @Builder,传入对应参数
       *
       * 执行流程:
       * index=0 → item.builder("红牛") → 渲染 Button("红牛")
       * index=1 → item.builder("康师傅") → 渲染 Button("康师傅")
       */
      ForEach(globalBuilder, (item: WrappedBuilder<[string]>, index: number) => {
        item.builder(titles[index])
      })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

效果如图。

mutableBuilder

当状态变量是wrapBuilder类型时,状态变量发生改变,UI不会跟随改变。此时可以使用mutableBuilder代替wrapBuilder

wrapBuilder的缺陷:

@Builder
function textBuilder(p: string) {
  Text(p)
}

@Builder
function buttonBuilder(p: string) {
  Button(p)
}

@Entry
@ComponentV2
struct Index {
  @Local message: string = 'init';
  @Local text: WrappedBuilder<[string]> = wrapBuilder(textBuilder);

  build() {
    Column() {
      this.text.builder(this.message) // 预期发生更新,但是实际没有更新
      Button("改变").onClick(() => {
        this.text = wrapBuilder(buttonBuilder); // 点击Button, 页面不会发生更新
      })
    }
  }
}

WrappedBuilder替换为mutableBuilder

  @Local text: MutableBuilder<[string]> = mutableBuilder(textBuilder);

完整代码:

@Builder
function textBuilder(p: string) {
  Text(p)
}

@Builder
function buttonBuilder(p: string) {
  Button(p)
}

@Entry
@ComponentV2
struct Index {
  @Local message: string = 'init';
  @Local text: MutableBuilder<[string]> = mutableBuilder(textBuilder);

  build() {
    Column({ space: 10 }) {
      this.text.builder(this.message) // 预期发生更新,但是实际没有更新
      Button("改变").onClick(() => {
        this.text = wrapBuilder(buttonBuilder); // 点击Button, 页面不会发生更新
      })
    }
    .width("100%")
    .height("100%")
    .justifyContent(FlexAlign.Center)
  }
}

总结

Builder 类型对比表

Builder 类型 核心作用 this 指向 是否可赋值给变量/数组 响应式更新 典型使用场景
@Builder 轻量级 UI 复用单元 调用处的组件 ❌ 不支持 ✅ 支持 组件内简单 UI 结构复用
@BuilderParam UI 插槽声明 子组件自身 ❌ 不支持 ✅ 支持 父组件向子组件传递自定义 UI 内容
@LocalBuilder 组件内 UI 复用(保持 this 上下文) 定义处的组件 ❌ 不支持 ✅ 支持 需要保持原始 this 上下文的 UI 复用
wrapBuilder 包装 @Builder 为可传递对象 包装后的对象 ✅ 支持 ❌ 不支持 动态存储、数组循环、参数传递
mutableBuilder 可响应式更新的包装器 包装后的对象 ✅ 支持 ✅ 支持 需要响应式更新的动态 Builder 切换

最后

关注我,持续分享鸿蒙开发 + AI 提效的实战技巧。

UniApp开发应用多平台上架全流程:H5小程序iOS和Android

UniApp 开发的应用上架流程因目标平台(如H5、小程序、iOS、Android)而异。以下是 UniApp 应用上架的详细流程和注意事项。

1.H5 上架

H5 应用的上架主要是将应用部署到服务器,并通过域名访问。

1.1打包 H5 应用

1.2部署到服务器

  • 将打包后的文件上传到服务器(如Nginx、Apache)。
  • 配置服务器,确保正确路由和资源加载。

1.3配置域名与 HTTPS

  • 绑定域名,确保用户可以通过域名访问应用。
  • 配置 HTTPS,确保数据传输安全。

1.4测试与发布

  • 在浏览器中访问应用,确保功能正常。
  • 将应用链接分享给用户。

2.小程序上架

以微信小程序为例,其他小程序(如支付宝、百度)流程类似。

2.1打包小程序

2.2上传到微信开发者工具

  • 打开微信开发者工具,选择“导入项目”。
  • 选择打包后的小程序目录,填写 AppID 和项目名称。
  • 点击“确定”导入项目。

2.3调试与测试

  • 在微信开发者工具中调试应用,确保功能正常。
  • 使用真机预览功能,在手机上测试应用。

2.4提交审核

  • 在微信开发者工具中点击“上传”。
  • 填写版本号和项目备注,点击“上传”。
  • 登录微信公众平台,提交审核。

2.5发布

  • 审核通过后,在微信公众平台点击“发布”。
  • 用户可通过微信搜索或扫码使用小程序。

3.iOS 上架

iOS 应用的上架需要通过 App Store 审核。

3.1打包 iOS 应用

  • 使用 HBuilderX 的云打包功能:

    • 打开 HBuilderX,选择“发行” -> “原生App-云打包”。
    • 选择 iOS 平台,配置证书和描述文件。
    • 点击“打包”,生成 .ipa 文件。

对于证书和描述文件的管理,开发者可以使用AppUploader工具直接创建和管理iOS开发者或发布证书,无需钥匙串助手,支持多电脑协同使用,简化证书申请流程。

3.2配置 App Store Connect

  • 登录 App Store Connect。
  • 创建新应用,填写应用名称、描述、截图等信息。
  • 上传应用图标和预览视频。

AppUploader还支持批量上传应用截图和描述信息到App Store Connect,提高效率。

3.3上传应用

  • 使用 Xcode 或 Transporter 工具上传 .ipa 文件到 App Store Connect。

此外,AppUploader工具允许开发者在Windows、Linux或Mac系统中直接上传IPA文件到App Store,无需Mac电脑,比传统工具更高效。

3.4提交审核

  • 在 App Store Connect 中提交应用审核。
  • 填写审核信息,确保符合 Apple 的审核指南。

3.5发布

  • 审核通过后,设置发布日期。
  • 应用会自动发布到 App Store。

4.Android 上架

Android 应用的上架主要通过 Google Play 或其他应用商店。

4.1打包 Android 应用

  • 使用 HBuilderX 的云打包功能:

    • 打开 HBuilderX,选择“发行” -> “原生App-云打包”。
    • 选择 Android 平台,配置签名证书。
    • 点击“打包”,生成 .apk 或 .aab 文件。

4.2配置 Google Play Console

  • 登录 Google Play Console。
  • 创建新应用,填写应用名称、描述、截图等信息。
  • 上传应用图标和预览视频。

4.3上传应用

  • 在 Google Play Console 中上传 .aab 或 .apk 文件。

4.4提交审核

  • 填写应用内容分级和隐私政策。
  • 提交应用审核,确保符合 Google Play 的政策。

4.5发布

  • 审核通过后,设置发布日期。
  • 应用会自动发布到 Google Play。

5.上架注意事项

5.1应用合规

  • 确保应用内容符合各平台的政策和法律法规。
  • 提供隐私政策链接,明确用户数据使用方式。

5.2应用图标与截图

  • 提供高质量的图标和截图,符合平台要求。
  • 确保截图展示应用的核心功能。

5.3版本管理

  • 使用语义化版本号(如 v1.0.0)。
  • 记录版本更新日志,方便用户了解新功能。

5.4测试与优化

  • 在上架前进行全面测试,确保应用稳定运行。
  • 优化应用性能,提升用户体验。

总结

UniApp 应用的上架流程因目标平台而异,但总体包括打包、配置、上传、审核和发布等步骤。通过合理的上架流程和注意事项,可以确保应用顺利发布并触达用户。

flutter接入三方库运行报错:Error running pod install

最近在研究flutter,在flutter中引入第三方webview_flutter后,运行iOS设备时报错,具体报错如下:

Error running pod install

Error launching application on iPhone 15.

看问题时iOS的cocoapod在执行pod install命令下载第三方库时出现问题,如是我们找到项目中ios目录,使用xcode打开项目看看情况,

打开后发现项目包错Module 'webview_flutter_wkwebview' not found,很明显这里第三方没有下载下来

如是我们打开控制台cd 到项目的iOS目录,执行pod install这时候我们能看到控制台提示:/Library/Ruby/Gems/2.6.0/gems/ffi-1.17.0-arm64-darwin/lib/2.6/ffi_c.bundle (LoadError)

/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- ffi_c (LoadError)

这个错误表明 Ruby 在尝试加载 ffi_c 时失败了,通常是因为 ffi gem 没有正确安装或与系统 Ruby 不兼容

 重新安装 ffi gem

ffi gem 可能没有正确安装或损坏,可以尝试重新安装。

卸载ffi gem:

gem uninstall ffi

#如果报权限问题就使用

sudogem uninstall ffi

重新安装 ffi gem:

gem install ffi

#如果报权限问题就使用

sudo gem install ffi

升级ruby环境

本地环境很多依赖于默认的ruby环境,所以我们可以使用rvm管理和安装多个版本ruby

安装 rvm:

\curl -sSL get.rvm.io | bash -s stable

安装一个 Ruby 版本(如 3.0.0):

rvm install 3.0.0

rvm use 3.0.0 --default

验证 Ruby 版本:

ruby-v

查看所有ruby:

rvm list

在安装ruby的时候我出现了下面的包错

Error running '__rvm_make -j6',

please read /Users/apple/.rvm/log/1739849439_ruby-3.0.0/make.log

我怀疑指定的OpenSSL版本可能没生效,于是干脆通过brew uninstall openssl命令把最新版本的OpenSSL卸载了,再次执行上面的命令一切正常🎉!

解决方案

如果不局限于安装Ruby 3.0版本,那么可以通过安装更高的Ruby版本解决该问题,可以参考这篇文章RVM - 安装最新Ruby版本。

如果一定要安装Ruby 3.0版本,请安装1.1版本的OpenSSL,并卸载最新版本,同时指定使用HomeBrew安装的OpenSSL完成安装:

安装1.1版本的OpenSSL

brew install openssl@1.1

卸载最新版本的OpenSSL

brew uninstall openssl

指定使用HomeBrew安装的OpenSSL完成安装

rvm install ruby-3.0.0 --with-openssl-dir=brew --prefix openssl

如果不想卸载最新版本,可以通过brew link命令切换(链接)openssl的版本完成安装:

安装1.1版本的OpenSSL

brew install openssl@1.1

切换OpenSSL的版本为1.1

brew link --overwrite openssl@1.1

--overwrite参数的作用是强制切换。如果不使用该参数,可以先执行brew unlink openssl命令后再执行brew link openssl@1.1命令完成切换。

指定使用HomeBrew安装的OpenSSL完成安装

rvm install ruby-3.0.0 --with-openssl-dir=brew --prefix openssl@1.1

执行完成后再次执行pod install 报错: `find_spec_for_exe':can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)

因使用 brew 安装工具导致 ruby 环境错乱, 执行pod install时报错提示找不到 gem 可执行文件

Traceback (most recent call last):    2: from /usr/local/bin/pod:23:in '    1: from /Library/Ruby/Site/2.6.0/rubygems.rb:294:in activate_bin_path'/Library/Ruby/Site/2.6.0/rubygems.rb:275:in `find_spec_for_exe': can't find gem cocoapods (>= 0.a) with executable pod (Gem::GemNotFoundException)

解决办法:

重新安装 ruby 环境(默认安装最新版本)

rvm reinstall ruby --disable-binary

运行结果

mruby-1.3.0 - #removing src/mruby-1.3.0 - please waitmruby-1.3.0 - #removing rubies/mruby-1.3.0 - please waitRVM does not have prediction for required space for mruby-1.3.0, assuming 150MB should be enough, let us know if it was not.Checking requirements for osx.Certificates bundle '/usr/local/etc/openssl@1.1/cert.pem' is already up to date.Requirements installation successful.Installing Ruby from source to: /Users/jack/.rvm/rubies/mruby-1.3.0, this may take a while depending on your cpu(s)...mruby-1.3.0 - #downloading 1.3.0, this may take a while depending on your connection...mruby-1.3.0 - #extracting 1.3.0 to /Users/jack/.rvm/src/mruby-1.3.0 - please waitmruby-1.3.0 - #compiling - please waitmruby-1.3.0 - #installing - please waitInstall of mruby-1.3.0 - #completeRequired ruby-2.7.0 is not installed.To install do: 'rvm install "ruby-2.7.0"'

重新安装 cocoapods

 gem install cocoapods

运行结果:

Successfully installed cocoapods-1.9.3Parsing documentation for cocoapods-1.9.3Done installing documentation for cocoapods after 1 seconds1 gem installed

再重新执行pod install就OK

Homebrew,是Mac OS X上的软件包管理工具,使用起来非常方便,安装任意软件包时 brew 会自动下载其依赖;

RubyGems 提供了ruby社区gem的托管服务,主要用于下载、安装使用 ruby 软件包

平常 iOS 开发使用 cocoapods 等工具都是使用 gems 进行安装管理,当使用 brew 安装软件包时有可能因依赖导致 ruby 环境错乱,不建议混合使用(使用 brew 也可以安装 cocoapods 而且很方便)

再次运行项目,又发现新的包错: 'Flutter/Flutter.h not found'

这里这样做

1、为了保守起见先备份ios文件

2、删除iOS文件

3、cd到项目跟目录执行命令重新创建ios项目

flutter create .

4、将备份的ios重要文件替换进来

详细见:www.kindacode.com/article/flu…

佑驾创新:与宁德时代(上海)智能科技有限公司达成战略合作

36氪获悉,佑驾创新公告,公司近期与宁德时代新能源科技股份有限公司的附属公司宁德时代(上海)智能科技有限公司正式签署战略合作协议。双方将本着优势互补、资源共享、互利共赢、共同发展的原则,建立长期、稳定、紧密的战略合作伙伴关系,共同开拓具有全球竞争力的智能化、电动化解决方案,推动在海内外市场实现技术与商业的双重突破。

热门中概股美股盘前普跌,小鹏汽车跌超5%

36氪获悉,热门中概股美股盘前普跌,截至发稿,小鹏汽车跌超5%,理想汽车、阿里巴巴、京东、百度、富途控股跌超3%,哔哩哔哩、蔚来跌超2%,拼多多、网易、微博跌超1%。

ST京蓝:公司股票核查结束,将于3月4日复牌

36氪获悉,ST京蓝公告,此前公告,公司股票自2026年2月27日开市起停牌核查。停牌期间,公司就股价波动的相关事项进行了核查。鉴于相关自查工作已完成,公司股票将于2026年3月4日(星期三)开市起复牌。

华安证券:控股股东拟1亿元至2亿元增持公司可转债并转股

36氪获悉,华安证券公告,公司控股股东安徽国控集团计划在3月4日—3月6日,通过集中竞价或大宗交易购买华安转债并在公司可转债转股期间内转股的方式增持公司股份,累计购买金额不低于1亿元,不超过2亿元,此次购买可转债并完成转股后增持公司A股股份的比例与前次已实施完成的增持计划累计不超过公司总股本的2%。

杉杉股份:若控股股东重整成功,公司实控人将变更为安徽省国资委

36氪获悉,杉杉股份发布公告,公司控股股东杉杉集团及其全资子公司朋泽贸易的重整计划草案已提交债权人会议表决,合并破产重整案第四次债权人会议于3月2日召开。若重整成功,公司的控制权将发生变更,公司控股股东将变更为安徽皖维集团有限责任公司,实际控制人将变更为安徽省国资委。但重整计划尚需相关会议审议表决通过并获得法院批准,结果存在不确定性。公司生产经营正常,未受重大影响。

新加坡据悉拟评估将其发展为实物黄金交易枢纽的可行性

据报道,新加坡金融管理局(MAS)与包括两大黄金做市商瑞银、摩通等多家金融机构会谈,评估把新加坡发展为实物黄金交易枢纽的可行性。知情人士透露,新加坡有意发展成为黄金贸易及仓储枢纽,并获央行及家族办公室等机构支持。而新交所亦正评估市场对新黄金合约的需求。相关规划仍处于初步阶段,不排除未来或有调整。(财联社)

华为杨超斌:全球日均Token消耗量快速增长,过去两年增长近300倍

36氪获悉,在MWC26 巴塞罗那期间,华为ICT BG CEO杨超斌发表主题演讲。杨超斌表示,全球日均Token消耗量快速增长,过去两年增长近300倍,引爆文生视频、智能购物等AI应用;全球行业中已有超3000万个AI Agent协同工作,深入生产、制造、金融等行业。这给移动产业带来前所未有的新机遇,也对网络能力提出新的要求:为支撑AI多模态的端云数据交互,网络需从过去以下行为主,迈向上下行超大带宽;为实现AI实时协同与智能决策,网络需提供安全、可靠、超低时延的体验。

上期所调整燃料油期货相关合约涨跌停板幅度和交易保证金比例

36氪获悉,上期所发布通知,经研究决定,自2026年3月4日(星期三)收盘结算时起,涨跌停板幅度和交易保证金比例调整如下: 燃料油期货fu2609、fu2610、fu2611、fu2612、fu2701、fu2702、fu2703合约的涨跌停板幅度为12%,套保持仓交易保证金比例为13%,一般持仓交易保证金比例为14%。 如遇《上海期货交易所风险控制管理办法》第十三条规定情况,则在上述涨跌停板幅度、交易保证金比例基础上调整。 关于涨跌停板和交易保证金的其他事项按《上海期货交易所风险控制管理办法》及相关业务规则执行。

Claude CLI 从安装到使用完整教程(Windows 版)

Claude Code 是 Anthropic 官方推出的命令行 AI 编程助手,可以直接在终端中与 Claude 对话,帮助你完成代码编写、调试、重构等任务。本教程带你在 Windows 系统上从零开始,快速上手 Claude CLI。


一、环境准备

在安装 Claude CLI 之前,需要确保你的系统满足以下条件:

  • Node.js:版本 18 及以上
  • npm:包管理工具(随 Node.js 一同安装)
  • 操作系统:Windows 10 / Windows 11
  • 终端:推荐使用 PowerShell 5.1+Windows Terminal
  • 网络:能正常访问 Anthropic API,如果有自备的公益API也行,例如anyrouter

安装 Node.js

前往 nodejs.org 下载最新 LTS 版本的 Windows 安装包(.msi),按向导完成安装,安装时勾选"自动安装必要工具"选项。

安装完成后,打开 PowerShell 验证版本:

node --version
# 输出示例:v24.14.0

npm --version
# 输出示例:11.9.0

01-flowchart-install-flow.png

二、安装 Claude CLI

打开 PowerShell(以管理员身份运行),执行全局安装命令:

npm install -g @anthropic-ai/claude-code

提示:如果安装时报权限错误,请右键点击 PowerShell 选择"以管理员身份运行"后重试。

安装完成后,验证安装是否成功:

claude --version

更新到最新版本

npm update -g @anthropic-ai/claude-code

解决 PATH 问题

如果提示 claude 不是可识别的命令,需要将 npm 全局包路径加入系统 PATH:

# 查看 npm 全局包安装路径
npm config get prefix

将输出的路径(如 C:\Users\你的用户名\AppData\Roaming\npm)添加到系统环境变量 PATH 中:

  1. 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
  2. 在"用户变量"中找到 Path,点击"编辑"
  3. 点击"新建",粘贴上述路径
  4. 确定保存后,重新打开 PowerShell 使其生效

三、配置 API Key

Claude CLI 需要 Anthropic API Key 才能正常工作。

获取 API Key

  1. 访问 console.anthropic.com
  2. 注册或登录账号
  3. 进入 API Keys 页面
  4. 点击 Create Key 生成新的 API Key

设置环境变量(PowerShell)

临时设置(仅当前会话有效):

$env:ANTHROPIC_API_KEY = "sk-ant-xxxxxxxxxxxxxxxx"

永久设置(推荐):

方法一:通过 PowerShell 命令写入用户环境变量:

[System.Environment]::SetEnvironmentVariable("ANTHROPIC_API_KEY", "sk-ant-xxxxxxxxxxxxxxxx", "User")

方法二:通过系统界面设置:

  1. 右键"此电脑" → "属性" → "高级系统设置" → "环境变量"
  2. 在"用户变量"区域点击"新建"
  3. 变量名填写 ANTHROPIC_API_KEY,变量值填写你的 API Key
  4. 确定保存,重新打开 PowerShell 使其生效

验证环境变量已生效:

echo $env:ANTHROPIC_API_KEY

四、基础使用

启动交互模式

在项目目录下打开 PowerShell,运行 claude,进入交互式对话:

cd C:\Users\你的用户名\projects\your-project
claude

进入后,你会看到提示符,可以直接输入问题或指令。

单次查询模式

使用 -p 参数执行一次性查询:

claude -p "解释这个项目的目录结构"

处理文件

让 Claude 分析或修改特定文件:

claude -p "审查 src/index.js 中的代码,找出潜在的 bug"

五、核心功能演示

代码生成

> 用 Python 写一个读取 CSV 文件并计算每列平均值的脚本

代码解释

> 解释 @src/utils/parser.ts 这个文件的作用

代码重构

> 重构 @components/Button.jsx,将 class 组件改为函数组件,并添加 TypeScript 类型

调试协助

> 我的应用报错:TypeError: Cannot read property 'map' of undefined,帮我分析原因

生成测试

02-infographic-features-overview.png

> 为 @src/api/user.js 中的所有函数生成单元测试

六、常用命令与快捷键

操作 命令 / 快捷键
启动 Claude claude
单次查询 claude -p "问题"
查看帮助 claude --help
清空对话 /clear
退出 /exitCtrl+C
查看历史 /history

常用 Slash 命令

  • /help — 查看所有可用命令
  • /clear — 清除当前对话上下文
  • /compact — 压缩对话历史以节省 Token
  • /model — 切换使用的模型
  • /cost — 查看本次会话的 Token 消耗

七、项目上下文管理

CLAUDE.md 文件

在项目根目录创建 CLAUDE.md 文件,Claude 会自动读取其中的内容作为项目背景:

# 项目说明

这是一个 React + TypeScript 的电商平台前端项目。

## 技术栈
- React 18
- TypeScript 5
- Tailwind CSS
- Zustand 状态管理

## 编码规范
- 使用函数组件和 Hooks
- 组件文件使用 PascalCase 命名
- 工具函数使用 camelCase 命名

在 PowerShell 中快速创建该文件:

New-Item -Path "CLAUDE.md" -ItemType File
notepad CLAUDE.md

引用文件

在对话中使用 @文件路径 引用具体文件:

> 参考 @src/components/Card.tsx 的风格,创建一个新的 Modal 组件

八、高级配置

配置文件

Claude CLI 支持通过配置文件自定义行为,配置文件位于:

  • 全局C:\Users\你的用户名\.claude\settings.json
  • 项目.claude\settings.json

在 PowerShell 中查看全局配置目录:

explorer "$env:USERPROFILE\.claude"

示例配置:

{
  "model": "claude-opus-4-6",
  "theme": "dark",
  "autoApprove": false
}

权限模式

Claude CLI 有三种权限模式:

  • 默认模式:每次文件修改都需要用户确认
  • 自动批准--dangerously-skip-permissions 自动执行所有操作(谨慎使用)
  • 只读模式:仅读取文件,不做修改

九、最佳实践

  1. 使用 Windows Terminal:比默认 PowerShell 窗口体验更好,支持多标签和彩色输出
  2. 始终在项目根目录启动:这样 Claude 能更好地理解项目结构
  3. 编写详细的 CLAUDE.md:提供技术栈、编码规范等背景信息
  4. 明确描述需求:越具体的指令,生成的结果越准确
  5. 分步执行复杂任务:将大任务拆分为小步骤,逐一确认
  6. 定期使用 /compact:长对话时压缩上下文,避免 Token 超限

十、常见问题

Q: 提示 claude 不是内部或外部命令

检查 npm 全局包路径是否在 PATH 中,参考"安装 Claude CLI"章节中的 PATH 配置步骤。

# 查看 npm 全局包路径
npm config get prefix

Q: PowerShell 提示脚本执行被禁止?

以管理员身份运行 PowerShell,执行以下命令允许本地脚本运行:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Q: API 请求失败,返回 401 错误?

检查 ANTHROPIC_API_KEY 环境变量是否正确设置,或 Key 是否已过期:

echo $env:ANTHROPIC_API_KEY

Q: 响应速度慢?

可以切换到更快的模型,如 claude-haiku-4-5

/model claude-haiku-4-5-20251001

总结

Claude CLI 是一个强大的 AI 编程助手,将 Claude 的能力无缝集成到你的开发工作流中。通过本教程,你已经掌握了在 Windows 上从安装配置到日常使用的完整流程。建议在实际项目中多加练习,充分利用 Claude 的能力提升开发效率。

更多文档请参考官方文档:docs.anthropic.com/claude-code

如果你喜欢本教程,记得点赞+收藏!关注我获取更多AI相关干货

中国石油:短期油价波动存在较大不确定性

36氪获悉,中国石油发布股票交易异常波动公告称,公司A股股票2月27日、3月2日和3月3日连续三个交易日内收盘价格涨幅偏离值累计超过20%。近期国际原油市场受地缘局势、供需格局等多重因素影响,价格呈现宽幅震荡走势,短期油价波动存在较大不确定性,请投资者注意风险。
❌