尊重原创, 共同进步.
前提介绍
公司有个项目主要使用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
结语
填完坑后, 发现团队协作的项目确实有很多需要改善的地方, 也有很多改善的空间. 记录于此, 以作回顾.