【坑位提醒】Flutter 鸿蒙开发:Mac 跑得好好的,Windows 报 Git 依赖版本错误?半天心血总结出的真相!

229 阅读3分钟

前言

在进行 Flutter 鸿蒙开发时,由于很多插件(如 image_picker, file_selector)需要引用华为或 SIG 维护的特定分支。你可能会遇到一个极其离谱的现象:同一个项目代码,之前在 Mac 上 flutter pub get 秒过,在 Windows 上却死活报错:

ERR: Package not available (the pubspec for image_picker 1.1.2 from git has version 1.0.2).

明明 Git 仓库里版本是对的,为什么 Windows 固执地认为它是旧版本?本文带你一分钟跳坑。


一、 现象描述

pubspec.yaml 中配置了如下依赖:

YAML

image_picker:
  git:
    url: https://gitcode.com/openharmony-sig/flutter_packages.git
    path: packages/image_picker/image_picker
    ref: br_image_picker-v1.1.2_ohos  # 明确指向 1.1.2 版本

报错信息:

Package not available (the pubspec for image_picker 1.1.2 from git has version 1.0.2).

你去浏览器里翻openharmony-sig的源码,明明br_image_picker-v1.1.2_ohos的版本号就是 1.1.2。你甚至怀疑是不是 GitCode 挂了,或者是自己眼睛花了。


二、 幕后真凶:Windows 的“长路径限制”

这其实不是 Flutter 的 Bug,也不是 Git 的 Bug,而是 Windows 文件系统默认限制(MAX_PATH: 260字符)Git 静默失败 共同酿成的惨剧。

1. 路径太深了

Flutter 在缓存 Git 依赖时,路径极深:

C:\Users\你的用户名\AppData\Local\Pub\Cache\git\flutter_packages-xxxx\packages\image_picker\image_picker\pubspec.yaml

这个路径轻轻松松就会突破 260 个字符。

2. Git 的“摆烂”行为

当路径超过限制时,Windows 版 Git 在执行 checkout(切换分支)时会静默失败

  • 结果: Git 以为自己切到了新分支,但磁盘上的文件实际上还是默认分支(可能是 master 或旧版)的内容。
  • Pub 的反应: Pub 工具去读磁盘上的 pubspec.yaml,发现版本号跟预期不符,直接报错退出。

三、 终极解决方案(三步走)

如果你在 Windows 上遇到这个“版本对不上”的逆天报错,请按以下步骤操作:

1. 开启 Windows 系统长路径支持

管理员身份打开 PowerShell,运行以下命令:

PowerShell

New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force

2. 开启 Git 的长路径支持

在终端运行:

Bash

git config --global core.longpaths true

3. 强力清除“有毒”缓存

这是最关键的一步,必须手动清理已经出错的本地缓存:

  1. 删除 Pub 缓存中的 Git 目录:

    直接删除 C:\Users\你的用户名\AppData\Local\Pub\Cache\git 下的所有内容。

  2. 删除项目锁文件:

    删除项目根目录下的 pubspec.lock

  3. 重新获取:

    运行 flutter pub get


四、 总结

鸿蒙适配之路本就坎坷,Windows 的这个环境坑更是杀人于无形。

  • Mac 没事: 因为 Unix 系系统没有这种古老的路径长度限制。
  • Windows 报错: 往往是因为路径过深导致 Git 切换分支失败。

一句话经验:在 Windows 上搞 Flutter 开发,第一件事就是把系统的 LongPathsEnabled 给开了!

希望这篇文档能帮到正在绝望中的你。如果解决了你的问题,记得点个赞!


互动环节

你在鸿蒙适配过程中还遇到了哪些“离谱”的报错?欢迎在评论区交流,我们一起排坑!