flutter-deploy 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 14c53b7da537f3cb0e9e18bd1ac73889cf58737e2e0041713ec8d04a41021e69
4
+ data.tar.gz: d2c6f165c22932bcd2beed55f447c0015f2a9a323751ddcf09ddfb3377b2f6a8
5
+ SHA512:
6
+ metadata.gz: bb1fadd13a1befb258ad18dc070e2f99f10ae531e6f0397e21eb7a8cac43291e96e5c3fb51a82b4a2f991afcafc6f66d630fe1ebf94c92c5939895945e2b3516
7
+ data.tar.gz: 917e7a625c24a4b69f79e2ddaa9523dc25a7f372d3d580056c06cb3c60376f0ef546e5d544681383d97c8383496f3072018de43e63bab40f7031e5dc7b3efbc6
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Flutter::Deploy
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/flutter/deploy`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Install the gem and add to the application's Gemfile by executing:
10
+
11
+ $ bundle add flutter-cli
12
+
13
+ If bundler is not being used to manage dependencies, install the gem by executing:
14
+
15
+ $ gem install flutter-cli
16
+
17
+ ## Usage
18
+
19
+ TODO: Write usage instructions here
20
+
21
+ ## Development
22
+
23
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
24
+
25
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
26
+
27
+ ## Contributing
28
+
29
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/flutter-deploy. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/flutter-deploy/blob/main/CODE_OF_CONDUCT.md).
30
+
31
+ ## License
32
+
33
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
34
+
35
+ ## Code of Conduct
36
+
37
+ Everyone interacting in the Flutter::Deploy project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/flutter-deploy/blob/main/CODE_OF_CONDUCT.md).
38
+ =======
39
+ # flutter-cli
data/bin/flutter-cli ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "build"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ # require "irb"
15
+ # IRB.start(__FILE__)
16
+ # puts __FILE__
17
+ # puts $PROGRAM_NAME
18
+ # puts __dir__
19
+ # puts File.expand_path("../Gemfile", __dir__)
20
+ if $PROGRAM_NAME == __FILE__
21
+ ENV["BUNDLE_GEMFILE"] = File.expand_path("../Gemfile", __dir__)
22
+ require "bundler/setup"
23
+ end
24
+
25
+ Flutter::Command.run(ARGV)
data/lib/build.rb ADDED
@@ -0,0 +1,67 @@
1
+ require "command"
2
+ require "produce"
3
+ require "repo"
4
+ require "upload"
5
+ require "colored2"
6
+
7
+ module Flutter
8
+ class Command
9
+ class Build < Command
10
+ self.summary = "Build the Flutter module into a framework and upload it to your private repository"
11
+ self.description = <<-DESC
12
+ Build the Flutter module into a framework and upload it to your private repository. If an `BUILD_CONFIG` is specified, the command can produce a given configuration framework.
13
+ You can set up the configuration for `debug`、`profile`、`release`, If none given, By default, all build configurations are built.
14
+ DESC
15
+ self.arguments = [
16
+ CLAide::Argument.new("BUILD_CONFIG", false, false)
17
+ ]
18
+ def self.options
19
+ [
20
+ ["--build-only", "build only Don\u2019t deploy"],
21
+ ["--ignore-gp", "Don\u2019t pull new code from remote, use your local code"],
22
+ ["--messae=msg", "git commit log"],
23
+ ["--branch=branch", "which branch to build"],
24
+ ["--project-dir=/project/dir", "The path to the root of the project directory"]
25
+ ].concat(super)
26
+ end
27
+
28
+ def initialize(argv)
29
+ super
30
+ @build_only = argv.flag?("build-only")
31
+ Flutter::Config.instance.ignore_gp = argv.flag?("ignore-gp")
32
+ Flutter::Config.instance.debug = argv.flag?("debug")
33
+ # flutter module 根目录
34
+ Flutter::Config.instance.project_dir = argv.option("project-dir")
35
+ Flutter::Config.instance.config = argv.shift_argument
36
+ end
37
+
38
+ def validate!
39
+ super
40
+ build_type = Config.instance.config
41
+ return unless !build_type.nil? && !Flutter::Config.instance.product_types.include?(build_type)
42
+
43
+ help! "构建类型指定错误,请输入要构建包的类型:(debug/profile/release)".red
44
+ end
45
+
46
+ def run
47
+ # 尝试更新私有库
48
+ Repo.repo_update
49
+ produce = Flutter::Produce.new
50
+ # 构建前的初始化工作
51
+ produce.setup
52
+ # 开始构建
53
+ result = produce.build
54
+ # 上传到私服
55
+ raise "构建失败,请检查环境配置......".red unless result
56
+
57
+ # 输出产物信息
58
+ produce.log
59
+ return if @build_only
60
+
61
+ # 上传
62
+ deploy = Flutter::Upload.new
63
+ deploy.upload
64
+ end
65
+ end
66
+ end
67
+ end
data/lib/command.rb ADDED
@@ -0,0 +1,12 @@
1
+ require "claide"
2
+ require "version"
3
+
4
+ module Flutter
5
+ class Command < CLAide::Command
6
+ self.abstract_command = true
7
+ self.command = "flutter-cli"
8
+ self.version = Flutter::Deploy::VERSION
9
+ self.summary = 'Build the Flutter module into a framework and upload it to your private repository'
10
+ self.description = "flutter-deploy, build and deploy to private git repo"
11
+ end
12
+ end
data/lib/config.rb ADDED
@@ -0,0 +1,24 @@
1
+ module Flutter
2
+ class Config
3
+ # 声明私有方法
4
+ private_class_method :new
5
+
6
+ attr_reader :router_name, :swift_version, :source, :xcconfig_path, :podfile_path, :framework_path, :product_types
7
+
8
+ attr_accessor :project_dir, :config, :debug, :new_products, :ignore_gp
9
+
10
+ def self.instance
11
+ @instance ||= new
12
+ end
13
+
14
+ def initialize
15
+ @source = "source 'git@code.sohuno.com:mtpc_sh_ios/ios_sohu_spec.git'"
16
+ @router_name = " pod 'SHNRouter', :subspecs => ['Core','Flutter'], :source => 'git@code.sohuno.com:mtpc_sh_ios/ios_sohu_spec.git'"
17
+ @swift_version = "SWIFT_VERSION=4.0"
18
+ @xcconfig_path = ".ios/Flutter/Generated.xcconfig"
19
+ @podfile_path = ".ios/Podfile"
20
+ @framework_path = "./build/flutter"
21
+ @product_types = %w[debug profile release]
22
+ end
23
+ end
24
+ end
data/lib/print.rb ADDED
@@ -0,0 +1,17 @@
1
+ require "tty-box"
2
+
3
+ module Flutter
4
+ class Print
5
+ def self.print_product_info(product_type, number, path)
6
+ print TTY::Box.info "产物类型:#{product_type}\n产物数量:#{number}\n产物路径:#{path}"
7
+ end
8
+
9
+ def self.print_all_products(products)
10
+ print TTY::Box.info "产物:\n#{products}"
11
+ end
12
+
13
+ def self.print_version_info(new_version, old_version)
14
+ print TTY::Box.info "新版本号为:#{new_version}\n旧版本号为:#{old_version}\n''"
15
+ end
16
+ end
17
+ end
data/lib/produce.rb ADDED
@@ -0,0 +1,161 @@
1
+ require "config"
2
+ require "fileutils"
3
+ require "colored2"
4
+ require "print"
5
+ module Flutter
6
+ class Produce
7
+ def insert_swift_version
8
+ file_path = Config.instance.xcconfig_path
9
+ File.open(file_path, "a") do |file|
10
+ file.puts(Config.instance.swift_version)
11
+ end
12
+ end
13
+
14
+ def insert_source
15
+ source = Flutter::Config.instance.source
16
+ podfile_path = Flutter::Config.instance.podfile_path
17
+ podfiles = File.readlines(podfile_path)
18
+ # 插入source源
19
+ podfiles.insert(0, source)
20
+ # 把修改的内容写回原文件
21
+ File.open(podfile_path, "w") { |file| file.puts(podfiles) }
22
+ end
23
+
24
+ def podfile_content
25
+ File.readlines(Config.instance.podfile_path)
26
+ end
27
+
28
+ # 目标字符串的行号
29
+ def target_line
30
+ # 读取原始文件内容,存放到数组中
31
+ file_lines = podfile_content
32
+ # 目标字符串
33
+ target_str = "flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))"
34
+ # 目标字符串行号
35
+ file_lines.index do |line|
36
+ line.include?(target_str)
37
+ end
38
+ end
39
+
40
+ def insert_router
41
+ # 获取目标字符串的行号
42
+ target_file_num = target_line
43
+
44
+ file_lines = podfile_content
45
+ return unless target_file_num
46
+
47
+ # 向目标字符串的下一行插入新字符串
48
+ file_lines.insert(target_file_num + 1, Config.instance.router_name)
49
+ # 将修改后的内容写回文件
50
+ File.open(Config.instance.podfile_path, "w") do |file|
51
+ file.puts(file_lines)
52
+ end
53
+ end
54
+
55
+ def clean
56
+ unless Flutter::Config.instance.ignore_gp
57
+ # 清空当前的工作目录
58
+ `git checkout .`
59
+ # 更新内容
60
+ `git pull`
61
+ end
62
+
63
+ # 清空flutter,并且更新依赖
64
+ if Flutter::Config.instance.debug
65
+ flutter_cmd = File.expand_path(File.join("~/.flutter_sdks/3.7.12", "bin", "flutter"))
66
+ system("#{flutter_cmd} clean && #{flutter_cmd} pub get")
67
+ system("#{flutter_cmd} pub upgrade")
68
+ else
69
+ system("flutter clean && flutter pub get")
70
+ system("flutter pub upgrade")
71
+ end
72
+ end
73
+
74
+ # 获取项目指定flutter SDK版本的SDK路径
75
+ # eg: ~/.flutter_sdks/#{version}
76
+ def flutter_root
77
+ generated_xcode_build_settings_path = File.expand_path(File.join(".ios", "Flutter", "Generated.xcconfig"), Dir.pwd)
78
+ unless File.exist?(generated_xcode_build_settings_path)
79
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
80
+ end
81
+
82
+ File.foreach(generated_xcode_build_settings_path) do |line|
83
+ matches = line.match(/FLUTTER_ROOT=(.*)/)
84
+ return matches[1].strip if matches
85
+ end
86
+ # This should never happen...
87
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
88
+ end
89
+ private :target_line, :insert_swift_version, :podfile_content, :insert_router, :clean, :insert_source, :flutter_root
90
+
91
+ def setup
92
+ project_dir = Config.instance.project_dir
93
+ # 切换到指定项目目录
94
+ Dir.chdir(project_dir) if project_dir
95
+ clean
96
+ # insert_source
97
+ insert_swift_version
98
+ insert_router
99
+ end
100
+
101
+ def build
102
+ # 创建framework存放目录
103
+ framework_path = Flutter::Config.instance.framework_path
104
+ FileUtils.mkdir_p(framework_path) unless Dir.exist?(framework_path)
105
+ config = Config.instance.config
106
+ flutter_cmd = File.expand_path(File.join(flutter_root, "bin", "flutter"))
107
+ if config
108
+ if config.casecmp("debug").zero?
109
+ system("#{flutter_cmd} build ios-framework --xcframework --no-universal --no-tree-shake-icons --debug --no-profile --no-release --output=#{Flutter::Config.instance.framework_path}")
110
+ elsif config.casecmp("profile").zero?
111
+ system("#{flutter_cmd} build ios-framework --xcframework --no-universal --no-tree-shake-icons --profile --no-debug --no-release --output=#{Flutter::Config.instance.framework_path}")
112
+ elsif config.casecmp("release").zero?
113
+ system("#{flutter_cmd} build ios-framework --xcframework --no-universal --no-tree-shake-icons --release --no-debug --no-profile --output=#{Flutter::Config.instance.framework_path}")
114
+ else
115
+ raise "请指定正确的构建类型(debug/profile/release)".red
116
+ end
117
+ else
118
+ # 构建所有环境的包(debug、profile、release)
119
+ system("#{flutter_cmd} build ios-framework --xcframework --no-universal --no-tree-shake-icons --output=#{Flutter::Config.instance.framework_path}")
120
+ end
121
+ end
122
+
123
+ def log
124
+ # 产物类型
125
+ product_type = if !Flutter::Config.instance.config
126
+ "所有类型(debug/profile/release)"
127
+ else
128
+ Flutter::Config.instance.config
129
+ end
130
+ # 产物路径
131
+ product_path = if !Flutter::Config.instance.config
132
+ File.expand_path(Flutter::Config.instance.framework_path, Dir.pwd)
133
+ else
134
+ File.expand_path(File.join(Flutter::Config.instance.framework_path, "#{product_type}"), Dir.pwd)
135
+ end
136
+
137
+ # 产物数量
138
+ product_num = if !Flutter::Config.instance.config
139
+ Dir.glob("#{File.join(product_path, "Debug")}/*").size
140
+ else
141
+ Dir.glob("#{product_path}/*").size
142
+ end
143
+ Flutter::Print.print_product_info(product_type, product_num, product_path)
144
+
145
+ # 产物
146
+ products = Dir.glob(File.join(product_path, "*.xcframework")).map do |file|
147
+ File.basename(file)
148
+ end
149
+ Flutter::Config.instance.new_products = products
150
+ puts "\n"
151
+ pro_str = ""
152
+ products.each do |ele|
153
+ pro_str = pro_str + ele + "\n"
154
+ end
155
+ pro_str = pro_str.rstrip
156
+ return if pro_str.empty?
157
+
158
+ Flutter::Print.print_all_products(pro_str)
159
+ end
160
+ end
161
+ end
data/lib/repo.rb ADDED
@@ -0,0 +1,20 @@
1
+ module Flutter
2
+ class Repo
3
+ def self.repo_update
4
+ spec_path1 = File.expand_path("~/.cocoapods/repos/ios_sohu_spec/")
5
+ spec_path2 = File.expand_path("~/.cocoapods/repos/SHSpecs/")
6
+ p = Pathname.new(spec_path1)
7
+ if Dir.exist?(p.realpath)
8
+ `pod repo update ~/.cocoapods/repos/ios_sohu_spec/`
9
+ else
10
+ `pod repo add ios_sohu_spec git@code.sohuno.com:mtpc_sh_ios/ios_sohu_spec.git`
11
+ end
12
+
13
+ if File.exist?(spec_path2)
14
+ `pod repo update ~/.cocoapods/repos/SHSpecs/`
15
+ else
16
+ `pod repo add SHSpecs git@code.sohuno.com:MPTC-iOS/SHSpecs.git`
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/upload.rb ADDED
@@ -0,0 +1,239 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flutter
4
+ class Upload
5
+ def initialize
6
+ # project_dir = Config.instance.project_dir
7
+ # # 切换到指定项目目录
8
+ # Dir.chdir(project_dir) if project_dir
9
+ # spec name
10
+ @spec_name = "ios_sohu_spec"
11
+ # pec库远程地址
12
+ @spec_url = "git@code.sohuno.com:mtpc_sh_ios/ios_sohu_spec.git"
13
+ # SoHuHost远程仓库地址
14
+ @framework_url = "git@code.sohuno.com:MOBILE-BASIC/SoHuHost.git"
15
+ @sohu_host_project_name = "SoHuHost"
16
+ # 手搜framework local地址(从远程clone到本地)
17
+ @framework_localPath = File.expand_path(File.join("..", "#{@sohu_host_project_name}"), Dir.pwd)
18
+ # 手搜spec文件名
19
+ @podspec_name = "#{@sohu_host_project_name}.podspec"
20
+ # spec文件路径
21
+ @spec_path = File.expand_path(File.join("#{@framework_localPath}", "#{@podspec_name}"), Dir.pwd)
22
+
23
+ # 产物的类型 debug/profile/release
24
+ @product_type = Flutter::Config.instance.config
25
+
26
+ @product_map = { 1 => "Debug", 2 => "Profile", 3 => "Release" }
27
+ # 用于记录旧的构建产物
28
+ @origin_products = []
29
+ end
30
+
31
+ # 上传
32
+ def upload
33
+ update_host
34
+ copy_products
35
+ modify_podspec_file
36
+ origin_version = get_origin_version
37
+ new_version = gen_new_version(origin_version)
38
+ update_version(new_version)
39
+ push_to_remote(new_version)
40
+ end
41
+
42
+ def log_products_diff
43
+ return unless !Flutter::Config.instance.new_products.empty? && !@origin_products.empty?
44
+
45
+ diff = Flutter::Config.instance.new_products.size > @origin_products.size ? Flutter::Config.instance.new_products.difference(@origin_products) : @origin_products.difference(Flutter::Config.instance.new_products)
46
+ return if diff.empty?
47
+
48
+ diff_str = ""
49
+ diff.each { |ele| diff_str = diff_str + ele + "\n" }
50
+ diff_str = diff_str.rstrip
51
+ if Flutter::Config.instance.new_products.size > @origin_products.size
52
+ print TTY::Box.info "产物新增了:\n#{diff_str}"
53
+ elsif Flutter::Config.instance.new_products.size < @origin_products.size
54
+ print TTY::Box.info "产物减少了:\n#{diff_str}"
55
+ end
56
+ end
57
+
58
+ # 更新下本地SoHuHost
59
+ def update_host
60
+ if !Dir.exist?(@framework_localPath)
61
+ # 执行Git clone
62
+ system("git clone #{@framework_url} #{@framework_localPath}")
63
+ else
64
+ # 执行 git pull
65
+ system("git -C #{@framework_localPath} checkout .")
66
+ system("git -C #{@framework_localPath} pull")
67
+ end
68
+ end
69
+
70
+ def check_build_type
71
+ return unless !@product_type || @product_type.empty?
72
+
73
+ puts "您构建了多个类型的产物:"
74
+ puts "[1]: debug"
75
+ puts "[2]: profile"
76
+ puts "[3]: release"
77
+ print "请选择一个上传(退出,请选择'q/Q'):"
78
+ input = $stdin.gets.chomp
79
+ exit if input.casecmp("q").zero?
80
+ @product_type = @product_map[input.to_i]
81
+ return if @product_type
82
+
83
+ print TTY::Box.error("请选择正确的构建类型")
84
+ exit
85
+ end
86
+
87
+ # 获得产物路径
88
+ def path_for_product
89
+ check_build_type
90
+ source_dir = File.expand_path(File.join(Flutter::Config.instance.framework_path, @product_type.capitalize), Dir.pwd)
91
+ end
92
+
93
+ # 将产物copy到@framework_localPath目录下
94
+ def copy_products
95
+ # 先记录下旧的产物,用于比较是否有更新
96
+ @origin_products = Dir.glob(File.join(@framework_localPath, "*.xcframework")).map do |file|
97
+ File.basename(file)
98
+ end
99
+
100
+ # 如果有则删之
101
+ system("find #{@framework_localPath} -name 'Debug' | xargs rm -rf")
102
+ system("find #{@framework_localPath} -name 'Profile' | xargs rm -rf")
103
+ system("find #{@framework_localPath} -name 'Release' | xargs rm -rf")
104
+ system("find #{@framework_localPath} -name 'iphoneos' | xargs rm -rf")
105
+ system("find #{@framework_localPath} -name 'iphonesimulator' | xargs rm -rf")
106
+ # 1、先移除旧的framework
107
+ xcframework_files = Dir.glob(File.join(@framework_localPath, "*.xcframework"))
108
+ xcframework_files.each do |xc_file|
109
+ # FileUtils.rm(xc_file)
110
+ system("rm -rf #{xc_file}")
111
+ end
112
+ # 2、将新产物move到@framework_localPath目录下
113
+ source_dir = path_for_product
114
+
115
+ # 获取源文件夹下的所有.xcframework文件
116
+ xc_files = Dir.glob(File.join(source_dir, "*"))
117
+ raise "当前产物路径:#{source_dir}为空,\n请先构建需要的产物" unless xc_files.any?
118
+
119
+ # 移动到目标文件夹下
120
+ xc_files.each do |file|
121
+ FileUtils.mv(file, @framework_localPath)
122
+ end
123
+ end
124
+
125
+ # 修改.podspec文件
126
+ def modify_podspec_file
127
+ # 1、移除.xcframework行和多余的空格
128
+ pattern = ".xcframework"
129
+ lines = File.readlines(@spec_path).reject { |line| line.match(pattern) }.filter { |element| element.strip.size > 0 }
130
+ new_vendored_framework = get_vendored_frameworks
131
+ # 插入新的vendored_frameworks
132
+ lines.insert(lines.size - 1, new_vendored_framework)
133
+ # 写入新的内容
134
+ File.open(@spec_path, "w") { |file| file.puts lines }
135
+ end
136
+
137
+ # 生成vendored_framewoks的字符串
138
+ def get_vendored_frameworks
139
+ xc_files = Dir.glob(File.join(@framework_localPath, "*.xcframework")).map do |file|
140
+ File.basename(file)
141
+ end
142
+ vendored_frameworks = " s.vendored_frameworks = "
143
+ xc_files.each do |line|
144
+ vendored_frameworks = vendored_frameworks + "'" + line + "'" + "," + "\n" + " "
145
+ end
146
+ # 去掉末尾所有空格和最后的`,`
147
+ vendored_frameworks.rstrip.chomp(",")
148
+ end
149
+
150
+ # 获取修改之前的versin
151
+ def get_origin_version
152
+ versin_line = File.readlines(@spec_path).filter { |line| line.gsub(/\s+/, "").match("s.version=") }
153
+ raise "\u6CA1\u6709\u627E\u5230version" unless versin_line.any?
154
+
155
+ version = versin_line.last.split("=").last
156
+
157
+ # (/^\'|\'$/)去掉首尾单引号的正则
158
+ version.strip.gsub(/^'|'$/, "")
159
+ end
160
+
161
+ # 生成新的version
162
+ def gen_new_version(origin_version)
163
+ # 按`·`分割一下
164
+ version_split = origin_version.split(".")
165
+ # 取出第一位日期部分
166
+ first_part = version_split.first
167
+ # 取出最后一位构建次数
168
+ last_part = version_split.last
169
+ # 获取当前日期
170
+ current_date = Time.now.strftime("%Y%m%d")
171
+ # 构建次数
172
+ build_time = if first_part.eql?(current_date)
173
+ # 相等说明当前日期构建多次
174
+ last_part.to_i + 1
175
+ else
176
+ # 不相等说明隔天首次构建
177
+ 0
178
+ end
179
+ # 获取pubspec.yaml 中的版本号
180
+ project_dir = Config.instance.project_dir
181
+ yaml_path = if !project_dir
182
+ File.join(Dir.pwd, "pubspec.yaml")
183
+ else
184
+ File.join(project_dir, "pubspec.yaml")
185
+ end
186
+ file_content = File.read(yaml_path)
187
+ # 提取版本号
188
+ version = file_content.match(/version: (.+)/)&.captures&.first
189
+ # 最终新的version
190
+ new_version = "#{current_date}.#{version}.#{build_time}"
191
+ # 输出版本信息
192
+ Flutter::Print.print_version_info(new_version, origin_version)
193
+ new_version
194
+ end
195
+
196
+ # 更新版本
197
+ def update_version(version)
198
+ # 读取文件内容
199
+ file_content = File.read(@spec_path)
200
+
201
+ # 提取版本号
202
+ version_match = file_content.match(/s\.version\s+=\s+'(.+)'/)
203
+ current_version = version_match&.captures&.first
204
+
205
+ return unless current_version
206
+
207
+ # 替换版本号
208
+ new_file_content = file_content.gsub(/s\.version\s+=\s+'#{current_version}'/, "s.version = '#{version}'")
209
+
210
+ # 将替换后的内容写回文件
211
+ File.write(@spec_path, new_file_content)
212
+ end
213
+
214
+ # 推到远程
215
+ def push_to_remote(version)
216
+ log_products_diff
217
+ # 当前的分支
218
+ branch_name = `git branch --show-current`
219
+ # 生成提交日志(版本号+构件类型+分支名)
220
+ log = "版本号:#{version}---构件类型:#{@product_type.capitalize}---分支名:#{branch_name}"
221
+ # 提交
222
+ `git -C #{@framework_localPath} add -A`
223
+ `git -C #{@framework_localPath} commit -m #{log}`
224
+ `git -C #{@framework_localPath} push origin`
225
+ # 打tag
226
+ `git -C #{@framework_localPath} tag -a #{version} -m #{log}`
227
+ `git -C #{@framework_localPath} push origin #{version}`
228
+
229
+ # 切换到SoHuHost目录下执行`pod repo push`
230
+ Dir.chdir(@framework_localPath) if @framework_localPath
231
+ # podspec 推到远程
232
+ result = system("pod repo push #{@spec_name} #{@podspec_name} --sources='#{@spec_url}' --allow-warnings --skip-import-validation")
233
+
234
+ raise "上传失败。。。。。。" unless result
235
+
236
+ print TTY::Box.success("#{@podspec_name}推送成功,请在项目中使用:\nflutter_pod '#{@sohu_host_project_name}', '#{version}'")
237
+ end
238
+ end
239
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Flutter
4
+ module Deploy
5
+ VERSION = "1.0.4"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flutter-deploy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ platform: ruby
6
+ authors:
7
+ - wangfei
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-09-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: claide
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.0.2
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.0.2
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: cocoapods
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - '='
38
+ - !ruby/object:Gem::Version
39
+ version: 1.11.3
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - '='
45
+ - !ruby/object:Gem::Version
46
+ version: 1.11.3
47
+ - !ruby/object:Gem::Dependency
48
+ name: colored2
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '3.1'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.1'
61
+ - !ruby/object:Gem::Dependency
62
+ name: tty-box
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 0.7.0
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 0.7.0
75
+ description: flutter deploy
76
+ email:
77
+ - firorwang@sohu-inc.com
78
+ executables:
79
+ - flutter-cli
80
+ extensions: []
81
+ extra_rdoc_files: []
82
+ files:
83
+ - README.md
84
+ - bin/flutter-cli
85
+ - lib/build.rb
86
+ - lib/command.rb
87
+ - lib/config.rb
88
+ - lib/print.rb
89
+ - lib/produce.rb
90
+ - lib/repo.rb
91
+ - lib/upload.rb
92
+ - lib/version.rb
93
+ homepage: http://www.baidu.com
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 2.6.0
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubygems_version: 3.0.3.1
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: flutter deploy
116
+ test_files: []