ref_libcurl_xcframework.rb (70 lines of code) (raw):
require 'xcodeproj'
require 'optparse'
# 解析命令行参数
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: script.rb [options]"
opts.on("-t", "--type TYPE", "Specify the HTTP type (http2 or http3)") do |type|
options[:type] = type
end
end.parse!
# 检查传入参数
if options[:type].nil? || !['http2', 'http3'].include?(options[:type])
puts "Please specify a valid type using --type (http2 or http3)"
exit 1
end
# 根据传入的参数设置 xcframework_path
xcframework_path = if options[:type] == 'http2'
'./precompiled/libcurl-HTTP2.xcframework'
else
'./precompiled/libcurl-HTTP3.xcframework'
end
# 打开 Xcode 项目
project_path = './EMASCurl.xcodeproj'
project = Xcodeproj::Project.open(project_path)
# 列出所有目标以确认目标名称
puts "Available targets:"
project.targets.each do |target|
puts " - #{target.name}"
end
# 找到目标 "EMASCurl"
target_name = 'EMASCurl'
target = project.targets.find { |t| t.name == target_name }
if target.nil?
puts "Target '#{target_name}' not found."
exit 1
else
puts "Found target '#{target_name}'."
end
# 列出所有构建阶段以确认结构
puts "Available build phases in target '#{target_name}':"
target.build_phases.each do |build_phase|
puts " - #{build_phase.display_name}"
end
# 找到 “Link Binary with Libraries” 构建阶段
link_build_phase = target.build_phases.find { |bp| bp.display_name == 'Frameworks' }
if link_build_phase.nil?
puts "'Link Binary With Libraries' build phase not found in target '#{target_name}'."
exit 1
else
puts "Found 'Link Binary With Libraries' build phase."
end
# 找到 'Frameworks' 组
frameworks_group = project.main_group['Frameworks']
# 定义要检查和删除的路径
paths_to_remove = [
'./precompiled/libcurl-HTTP2.xcframework',
'./precompiled/libcurl-HTTP3.xcframework'
]
# 删除之前可能添加到构建阶段的 xcframework 文件
paths_to_remove.each do |path|
file_ref = frameworks_group.files.find { |file| file.path == path }
if file_ref && link_build_phase.files_references.include?(file_ref)
puts "Removing #{path} from #{target_name}'s 'Link Binary With Libraries' build phase."
link_build_phase.remove_file_reference(file_ref)
end
end
# 向项目添加新 xcframework 文件
# 检查文件引用是否已经存在
file_ref = frameworks_group.files.find { |file| file.path == xcframework_path }
if file_ref.nil?
file_ref = frameworks_group.new_file(xcframework_path)
puts "Added new file reference for #{xcframework_path} to Frameworks group."
else
puts "File reference for #{xcframework_path} already exists in Frameworks group."
end
# 检查文件引用是否已经添加到构建阶段
unless link_build_phase.files_references.include?(file_ref)
link_build_phase.add_file_reference(file_ref)
puts "Added #{xcframework_path} to #{target_name}'s 'Link Binary With Libraries' build phase."
else
puts "#{xcframework_path} is already added to the 'Link Binary With Libraries' build phase."
end
# 保存项目更改
project.save
puts "Successfully updated project."