通过 Xcodeproj工具脚本实现创建Xcode工程并添加Cocoapods依赖

1,605 阅读2分钟

废话开篇:简单实现通过 Xcodeproj工具脚本实现创建Xcode工程并添加Cocoapods依赖

一、效果展示

屏幕录制2022-01-28 上午10.20.18.gif

创建完成

image.png

运行效果

WechatIMG114_gaitubao_339x717.jpeg

工程目录

image.png

二、实现思路

1、利用 Xcodeproj 进行 Xcode 工程配置

利用 CocoaPods/Xcodeproj 将重复的手动创建过程转换为命令自动执行。

Xcodeproj 是由 ruby 编写,这里选择用命令行安装

sudo gem install xcodeproj

说明文档 Xcodeproj

2、创建一个基础工程

创建基础工程的目的:在用 Xcodeproj 创建一个新的工程的后给新工程添加必要的文件并引用相关文件(.mmain.m、其他测试 target 下的 .m 文件)

3、创建脚本 .sh 文件

处理文件的复制、更名等相关操作。为新建工程提供创建条件,如:复制基础工程的相关 .m 文件,并进行更名。复制 podfile 文件并修改 target 名称。

4、创建 .rb 文件

xcodeproj 是由 ruby 编写的,因此,需要建立一个 .rb 文件,实现工程的自动配置。

5、目录结构

image.png

CustomBaseProject:基础工程

WSlXcode.sh:脚本文件

XcodeCreate.rb.rb 文件

三、CustomBaseProject 文件

image.png

这里作为基础工程的 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

image.png

别名设置

image.png

激活命令

source .bash_profile

在当前文件夹下就可以使用自定义脚本指令了。

好了,总结学习,大神勿笑[抱拳][抱拳][抱拳]