React Native仓库本地CocoaPods支持


声明: 转载注明本人出处, 请在方便的情况下尽量告知.

尊重原创, 共同进步.


前提介绍

公司有个项目主要使用ReactNative开发, 及npm link的方式安装到工程项目中. 由于项目进度紧张, 开发童鞋很多工作能省则省.

当该项目部分功能 (已完成git仓库建设) 移植到本人负责的老项目时, 出现了各种问题. Pods支持就是其中一个. 以下重点讲坑和填坑过程.

ORZ, 如果你是专业人士, 请直接弃文或者移步官方指导文档

1 直接npm link

由于之前集成React项目使用的是CocoaPods, 所以这个选项直接被Pass了.

否则, 就需要把所有的项目都重新导入一遍, 并对项目配置做全面的改动. 而且对于原有的版本管理也是一种冲击, 所以果断放弃.

2 手动拖拽

放弃的理由同1. 配置改动繁琐, 且容易出错.

3 添加CocoaPods支持

3.1 新增package.json

项目根目录下添加此文件, 内容示例如下:

{
  "name": "cocoapods-project-name",
  "version": "1.0.0",
  "description": "nothing to say",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+ssh://git@github.com/ABC/cocoapods-project-name.git"
  },
  "keywords": [
    "react-native",
    "cocoapods-project-name",
  ],
  "author": "ABC",
  "license": "MIT",
  "homepage": "https://github.com/ABC/cocoapods-project-name#readme"
}
复制代码

重要的内容为name, version, main, repository, 其它的选填, 更详细的参考官方描述.

3.2 新增podspec

根目录下新增name同名.podspec文件, 示例内容如下:

require 'json'

package = JSON.parse(File.read(File.join(__dir__, 'package.json')))

Pod::Spec.new do |s|
  s.name           = 'cocoapods-project-name'
  s.version        = package['version']
  s.summary        = package['description']
  s.description    = package['description']
  s.license        = package['license']
  s.author         = package['author']
  s.homepage       = package['homepage']
  s.source         = { :git => 'git@github.com/ABC/cocoapods-project-name.git', :tag => s.version }

  s.requires_arc   = true
  s.platform       = :ios, '8.0'

  s.source_files    = "ios/foler1/*.{h,m}",
            "ios/folder2/*.{h,m}"
  s.ios.vendored_library = "ios/folder2/*.a"
  s.ios.resource_bundles = {
    'MovieData' => ['to/resource/*.av'],
    'OtherResources' => ['to/another/resourece/*.av']
  }

  s.dependency             "React"
end
复制代码

大致的结构如示例, 重要的内容为name, version.

问题比较多的有source, source_files, ios.vendored_library, ios.resource_bundles, dependency.

  1. source 一般情况下需要填入准确的git仓库路径, 因为使用npm管理包, 已经把项目下载到本地的node_modules目录下, 所以这个设置可以忽略
  2. source_files 要注意目录, 编译路径会被包含, 指向如果错误的话, 会出现找不到文件的问题. 另外, 多个路径是用 ',' 隔开, 使用的字符串基本都是双引号 "
  3. ios.vendored_library 因为本地使用了部分静态库文件, 请使用该选项
  4. ios.resource_bundles 因为本地使用了部分图片/动画/音频/视频等资源文件, 请使用该选项. 官方推荐使用, 可以避免多开源项目共存时的名称空间污染问题
  5. dependency 依赖项. 一般情况下, 作为支持用的Pods仓库最好减少对其它项目的依赖, 避免多个第三方仓库对同一开源项目的依赖版本不同, 导致用户弃坑. ORZ

3.3 修改仓库中本地代码加载Bundle的方式

原来项目使用的方式是手动(ORZ)拷贝资源到主(目标)工程下, 这种做法只能给跪了. 经过修正, 目前方式如下:

- (NSBundle *)movieBundle {
    if (self.myBundle) {
        return self.myBundle;
    }
    self.myBundle = [NSBundle bundleForClass:[self class]];

    NSURL *bundleURL = [[self.myBundle resourceURL] URLByAppendingPathComponent:@"MovieData.bundle"];
    if (bundleURL) {
        self.myBundle = [NSBundle bundleWithURL:bundleURL];
    }

    return self.myBundle;
}

- (void)watchAV {
    // ... 苍老师, 你懂的
    [[AVAudioPlayer alloc] initWithContentsOfURL:[[self movieBundle] URLForResource:"Aoi" withExtension:@"av"] error:&error]
    // ...
}
复制代码

3.4 添加Tag

在公共(开源)项目仓库下, 一定一定要添加Tag标记! 这是程序员的美好品德~

git tag -a 1.0.0

随便填入点Tag标注内容, 以便通知需要关注的人

git push origin --tag

3.5 修改目标项目package.json文件

{
  # 其它内容(注意该文件不允许有注释)

  "dependencies": {
    "cocoapods-project-name", "^1.0.0",
  },

  # 其它内容(注意该文件不允许有注释)
}
复制代码

然后执行

npm install

3.6 修改目标项目Podfile文件

# 其它内容

target "ProjectTargetName" do
    pod 'cocoapods-project-name', path: 'node_modules/cocoapods-project-name'
end

# 其它内容
复制代码

然后执行

pod update --no-repo-update

结语

填完坑后, 发现团队协作的项目确实有很多需要改善的地方, 也有很多改善的空间. 记录于此, 以作回顾.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值