废话开篇:简单实现通过 Xcodeproj工具脚本实现创建Xcode工程并添加Cocoapods依赖
一、效果展示
创建完成
运行效果
工程目录
二、实现思路
1、利用 Xcodeproj 进行 Xcode 工程配置
利用 CocoaPods/Xcodeproj 将重复的手动创建过程转换为命令自动执行。
Xcodeproj 是由 ruby 编写,这里选择用命令行安装
sudo gem install xcodeproj
说明文档 Xcodeproj
2、创建一个基础工程
创建基础工程的目的:在用 Xcodeproj 创建一个新的工程的后给新工程添加必要的文件并引用相关文件(.m、main.m、其他测试 target 下的 .m 文件)
3、创建脚本 .sh 文件
处理文件的复制、更名等相关操作。为新建工程提供创建条件,如:复制基础工程的相关 .m 文件,并进行更名。复制 podfile 文件并修改 target 名称。
4、创建 .rb 文件
xcodeproj 是由 ruby 编写的,因此,需要建立一个 .rb 文件,实现工程的自动配置。
5、目录结构
CustomBaseProject:基础工程
WSlXcode.sh:脚本文件
XcodeCreate.rb:.rb 文件
三、CustomBaseProject 文件
这里作为基础工程的 podfile 文件里只添加了 Masonry。
platform :ios,'9.0'
target 'CustomBaseProject' do
pod 'Masonry'
end
四、WSlXcode.sh 文件
这里直接上代码
#!/bin/bash
function XcodeProjectCreate(){
read -p "是否创建自定义Xcode工程? yes|no: " isCreateCustomXcodeProject
if [ $isCreateCustomXcodeProject == "yes" ] || [ $isCreateCustomXcodeProject == "y" ]
then
# 输入项目名称
createProjectFileByName
else
echo "暂不需要"
fi
}
#创建工程文件名
function createProjectFileByName(){
read -p "请输入项目名称 " projectName
if [ ! -d $projectName ]
then
mkdir $projectName
#复制基础工程部分
copyACustomBaseProject $projectName
else
echo "文件夹存在"
createProjectFileByName
fi
}
#复制一份工程
function copyACustomBaseProject(){
# 复制相关初始化文件
cp -r "./CustomBaseProject/CustomBaseProject" "./$1"
cp -r "./CustomBaseProject/CustomBaseProjectTests" "./$1"
cp -r "./CustomBaseProject/CustomBaseProjectUITests" "./$1"
# 进入ProjectTests
cd "./$1"
# 修改文件名称为以用户输入名称为开头
mv "CustomBaseProject" $1"Project"
mv "CustomBaseProjectTests" $1"ProjectTests"
mv "CustomBaseProjectUITests" $1"ProjectUITests"
# 进入ProjectTests文件进行修改.m文件名称
cd "./"$1"ProjectTests"
mv "CustomBaseProjectTests.m" $1"ProjectTests.m"
# 进入ProjectUITests文件进行修改.m文件名称
cd "../"$1"ProjectUITests"
mv "CustomBaseProjectUITests.m" $1"ProjectUITests.m"
mv "CustomBaseProjectUITestsLaunchTests.m" $1"ProjectUITestsLaunchTests.m"
# 回到工程目录
cd "../"
createProjectByName $1
}
#创建工程
function createProjectByName(){
# 执行 XcodeCreate.rb 脚本传入文件名
ruby -w ../XcodeCreate.rb $1""
#cocoaPods操作
addPodFile $1
}
#添加podfile
function addPodFile(){
#复制podfile文件
cd "../"
cp -r "./CustomBaseProject/podfile" "./$1"
cd "./$1"
#替换工程名
sed -i '' 's/CustomBaseProject/'$1'Project/g' podfile
#安装第三方
pod install
}
#执行
XcodeProjectCreate
五、XcodeCreate.rb 文件
#!/usr/bin/ruby -w
#引用模块
require 'xcodeproj'
def createXcodeProj(name)
#文件名称类型是数组转字符串
name=name.join("")
#创建 Test.xcodeproj工程文件,并保存
Xcodeproj::Project.new(name + "Project.xcodeproj").save
# 打开创建的Test.xcodeproj文件
proj=Xcodeproj::Project.open(name + "Project.xcodeproj")
# 创建一个分组,名称为Test,对应的路径为./Test
wslGroup=proj.main_group.new_group(name + "Project","./" + name + "Project")
# 给Test分组添加文件引用
wslGroup.new_reference("../" + name + "Project/" + "AppDelegate.h")
refAppDelegate=wslGroup.new_reference("../" + name + "Project/" + "AppDelegate.m")
wslGroup.new_reference("../" + name + "Project/" + "SceneDelegate.h")
refSceneDelegate=wslGroup.new_reference("../" + name + "Project/" + "SceneDelegate.m")
wslGroup.new_reference("../" + name + "Project/" + "ViewController.h")
refViewController=wslGroup.new_reference("../" + name + "Project/" + "ViewController.m")
refAssets=wslGroup.new_reference("../" + name + "Project/" + "Assets.xcassets")
refLaunchScreen=wslGroup.new_reference("../" + name + "Project/Base.lproj/LaunchScreen.storyboard")
refLaunchMain=wslGroup.new_reference("../" + name + "Project/Base.lproj/Main.storyboard")
# 在Test分组下创建一个名字为Supporting Files的子分组,并给该子分组添加main和info.plist文件引用
supportingGroup=wslGroup.new_group("Supporting Files")
refMain=supportingGroup.new_reference("main.m")
supportingGroup.new_reference("Info.plist")
# 创建target
# name:target名称
# platform:平台 :ios或者:osx
target = proj.new_target(:application,name + "Project",:ios)
# 添加target配置信息
target.build_configuration_list.set_setting('INFOPLIST_FILE', "$(SRCROOT)/" + name + "Project/" + "Info.plist")
# target添加相关的文件引用,如.m文件 .storyboard文件
target.add_file_references([refAppDelegate,refSceneDelegate,refViewController,refMain,refAssets,refLaunchScreen,refLaunchMain])
# 测试类相关文件
testGroup=proj.main_group.new_group(name + "ProjectTests",name + "ProjectTests")
refProjectTests=testGroup.new_reference("../" + name + "ProjectTests/" + "./" + name + "ProjectTests.m")
testUIGroup=proj.main_group.new_group( name + "ProjectUITests",name + "ProjectUITests")
refProjectUITests=testUIGroup.new_reference("../" + name + "ProjectUITests/" + "./" + name + "ProjectUITests.m")
refProjectUITestsLaunchTests=testUIGroup.new_reference("../" + name + "ProjectUITests/" + "./" + name + "ProjectUITestsLaunchTests.m")
# 创建test target
testTarget = proj.new_target(:unit_test_bundle,name + "ProjectTests",:ios,**nil**,proj.products_group)
testRefrence = testTarget.product_reference
testRefrence.set_explicit_file_type('wrapper.cfbundle')
testRefrence.name = name + "ProjectTests.xctest"
# 创建UItest target
testTarget = proj.new_target(:unit_test_bundle,name + "ProjectUITests",:ios,**nil**,proj.products_group)
testRefrence = testTarget.product_reference
testRefrence.set_explicit_file_type('wrapper.cfbundle')
testRefrence.name = name + "ProjectUITests.xctest"
#工程引用测试类下的.m文件
testTarget.add_file_references([refProjectTests,refProjectUITests,refProjectUITestsLaunchTests])
#设置bundel ID
proj.targets[0].build_configurations.each do |config|
config.build_settings["PRODUCT_BUNDLE_IDENTIFIER"] = "com." + name
end
# 保存
proj.save
end
#执行
createXcodeProj(ARGV)
六、 总结与思考
常规执行脚本
sh WSlXcode.sh
创建 .bash_profile
touch .bash_profile
别名设置
激活命令
source .bash_profile
在当前文件夹下就可以使用自定义脚本指令了。
好了,总结学习,大神勿笑[抱拳][抱拳][抱拳]