class VFastDev

Public Class Methods

new(options) click to toggle source
# File lib/vfastdev.rb, line 46
def initialize(options)
  @vs_project_names = parse_vs_project_names
  @vs_framework_dir = 'VSFrameworks'
  @fastdev_dir = 'FastDev'
  @project_kept_names = options[:keep] || []
  @no_download_libs = options[:no_download_lib]
  @sync_main_project = options[:sync]

  @project_kept_names.each do |each|
    unless @vs_project_names.include?(each)
      puts "指定工程#{each}不存在"
      exit 0
    end
  end
  @project_kept_names << "VSBaseModule"
  @project_kept_names << "VSPublic"
  if @sync_main_project
    puts "还没实现"
  else
    init_context
    ajust_project
    unless @no_download_libs
      print_version_info
      download_libs
      unzip_libs
    end
    say_after_done
  end
end

Public Instance Methods

ajust_project() click to toggle source
# File lib/vfastdev.rb, line 112
  def ajust_project
    exclude_framework_names = [] #排除在外的静态库
    @project_kept_names.each do |name|
      exclude_framework_names << name + ".framework"
    end

    vs_framework_paths = [] #所有静态库路径
    @vs_project_names.each do |name|
      vs_framework_paths << name + ".framework"
    end
    project_path = 'Spec.xcodeproj'
    project = Xcodeproj::Project.open(project_path)

    puts '更改Spec.xcodeproj的main group的引用路径'
    project.main_group.set_source_tree('SOURCE_ROOT')
    project.main_group.set_path('../Spec')


    puts '更改Spec.xcodeproj中info.plist,pch,entitlements的引用路径'
# 修改info.plist,pch,entitlements的引用路径
    project.targets.each do |target|
      target.build_configurations.each do |config|
        if config.build_settings.has_key?('INFOPLIST_FILE')
          info_plist_config = config.build_settings['INFOPLIST_FILE']

          info_plist_config = "../Spec/" + info_plist_config
          config.build_settings['INFOPLIST_FILE'] = info_plist_config
        end
        if config.build_settings.has_key?('GCC_PREFIX_HEADER')
          pch_config = config.build_settings['GCC_PREFIX_HEADER']
          pch_config = "../Spec/" + pch_config
          config.build_settings['GCC_PREFIX_HEADER'] = pch_config
        end
        if config.build_settings.has_key?('CODE_SIGN_ENTITLEMENTS')
          entitlements_config = config.build_settings['CODE_SIGN_ENTITLEMENTS']
          entitlements_config = "../Spec/" + entitlements_config
          config.build_settings['CODE_SIGN_ENTITLEMENTS'] = entitlements_config
        end
      end
    end

    puts 'FRAMEWORK_SEARCH_PATHS新增路径'
    project.build_configuration_list.build_configurations.each do |config|
      if config.build_settings.has_key?('FRAMEWORK_SEARCH_PATHS')
        paths = config.build_settings['FRAMEWORK_SEARCH_PATHS']
        if paths.is_a?(String)
          config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [paths, @vs_framework_dir]
        else
          config.build_settings['FRAMEWORK_SEARCH_PATHS'] << @vs_framework_dir
        end
      end
    end

    puts '修改静态库库的引用'
    project.files.each do |file_ref|
      if file_ref.last_known_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.name) && !exclude_framework_names.include?(file_ref.name)
        file_ref.set_source_tree("SOURCE_ROOT")
        file_ref.set_path(@vs_framework_dir + "/" + file_ref.name)
      elsif file_ref.explicit_file_type == "wrapper.framework" && vs_framework_paths.include?(file_ref.path) && !exclude_framework_names.include?(file_ref.path)
        file_ref.set_source_tree("SOURCE_ROOT")
        file_ref.name = file_ref.path
        file_ref.set_path(@vs_framework_dir + "/" + file_ref.path)
      end
    end

    puts '修改Copy Modular Resources 脚本:"${SRCROOT}/Resources/Support/modular-resources-copy.sh" => "${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
    project.targets.each do |target|
      target.shell_script_build_phases.each do |phase|
        if phase.name == 'Copy Modular Resources'
          phase.shell_script = '"${SRCROOT}/../Spec/Resources/Support/modular-resources-copy.sh"'
        end
      end
    end
    project.save

    puts '生成新的workspace'
    workspace_xml = <<XML
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
</Workspace>
XML


    workspace = Xcodeproj::Workspace.from_s(workspace_xml)
    spec_file_ref = Xcodeproj::Workspace::FileReference.new("Spec.xcodeproj")
    workspace << spec_file_ref

    @project_kept_names.each do |each|
      fileRef = Xcodeproj::Workspace::FileReference.new("../#{each}/#{each}.xcodeproj")
      workspace << fileRef
    end

    pods_file_ref = Xcodeproj::Workspace::FileReference.new("../Pods/Pods.xcodeproj")
    workspace << pods_file_ref

    workspace_path = "Spec.xcworkspace"
    workspace.save_as(workspace_path)


  end
download_libs() click to toggle source

下载静态库

# File lib/vfastdev.rb, line 240
def download_libs
  @vs_project_names.each do |name|
    puts '下载:' + name
    File.open("#{@vs_framework_dir}/#{name}.framework.zip", 'wb') do |f|
      framework_name = "#{name}.framework"
      url = "http://192.168.33.79:8000/lib/dowload_framework_file?app_id=Spec&name=#{framework_name}"
      begin
        f.write(open(url) do |f1|
          f1.read
        end)
      rescue StandardError, Timeout::Error, SystemCallError, Errno::ECONNREFUSED
        puts $!
      end
    end
  end
end
init_context() click to toggle source

@!method 初始化环境:创建目录,拷贝工程文件 @param delete_frameworks 是否删除库目录

# File lib/vfastdev.rb, line 78
def init_context
  unless File.exist?(@fastdev_dir)
    puts "创建#{@fastdev_dir}目录"
    Dir.mkdir(@fastdev_dir)
  end
  Dir.chdir(@fastdev_dir)

  if File.exist?('Spec.xcodeproj')
    puts '删除FastDev/Spec.xcodeproj'
    FileUtils.rm_rf('Spec.xcodeproj')
  end
  puts '拷贝Spec.xcodeproj到FastDev'
  FileUtils.cp_r('../Spec/Spec.xcodeproj', 'Spec.xcodeproj')

  if File.exist?('Spec.xcworkspace')
    puts '删除FastDev/Spec.xcworkspace'
    FileUtils.rm_rf('Spec.xcworkspace')
  end
  puts '拷贝Spec.xcworkspace到FastDev'
  FileUtils.cp_r('../Spec.xcworkspace', 'Spec.xcworkspace')

  if File.exist?(@vs_framework_dir)
    unless @no_download_libs
      puts "删除FastDev/#{@vs_framework_dir}"
      FileUtils.rm_rf(@vs_framework_dir)
      puts "创建目录FastDev/#{@vs_framework_dir}"
      Dir.mkdir(@vs_framework_dir)
    end
  else
    puts "创建目录FastDev/#{@vs_framework_dir}"
    Dir.mkdir(@vs_framework_dir)
  end
end
parse_vs_project_names() click to toggle source
# File lib/vfastdev.rb, line 225
def parse_vs_project_names
  # 分析xcworkspace文件,查找VS开头的工程名字
  names = []
  tmp_workspace = Xcodeproj::Workspace.new_from_xcworkspace("Spec.xcworkspace")
  tmp_workspace.file_references.each do |file_ref|
    match = /VS[a-zA-Z0-9]*?(?=.xcodeproj)/.match(file_ref.path)
    if match != nil
      name = match[0]
      names << name
    end
  end
  return names
end
print_version_info() click to toggle source

输出静态库版本信息

say_after_done() click to toggle source
# File lib/vfastdev.rb, line 273
def say_after_done
  puts 'FastDev完成。关闭旧的Spec.xcworkspace,打开FastDev/Spec.xcworkspace文件开始开发。'
end
unzip_libs() click to toggle source

解压静态库

# File lib/vfastdev.rb, line 258
  def unzip_libs
    puts '解压静态库'
    Dir.chdir(@vs_framework_dir)
# 调用shell解压更简单,ruby不好写解压
    system `
zip_names=$(ls)
for name in $zip_names
do
    unzip -qq $name
    rm $name
done
`
    Dir.chdir('..')
  end