声明: 转载注明或, 请在方便的情况下尽量告知.
尊重原创, 共同进步.
前提介绍
公司有个项目主要使用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
.
source
一般情况下需要填入准确的git仓库路径, 因为使用npm管理包, 已经把项目下载到本地的node_modules目录下, 所以这个设置可以忽略source_files
要注意目录, 编译路径会被包含, 指向如果错误的话, 会出现找不到文件的问题. 另外, 多个路径是用 ',' 隔开, 使用的字符串基本都是双引号 "ios.vendored_library
因为本地使用了部分静态库文件, 请使用该选项ios.resource_bundles
因为本地使用了部分图片/动画/音频/视频等资源文件, 请使用该选项. 官方推荐使用, 可以避免多开源项目共存时的名称空间污染问题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
结语
填完坑后, 发现团队协作的项目确实有很多需要改善的地方, 也有很多改善的空间. 记录于此, 以作回顾.