aibika 1.3.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +11 -0
- data/History.txt +214 -0
- data/LICENSE.md +30 -0
- data/Manifest.txt +11 -0
- data/README.adoc +564 -0
- data/Rakefile +30 -0
- data/aibika.gemspec +50 -0
- data/bin/aibika +25 -0
- data/lib/aibika/aibika_builder.rb +191 -0
- data/lib/aibika/cli.rb +181 -0
- data/lib/aibika/host.rb +40 -0
- data/lib/aibika/library_detector.rb +88 -0
- data/lib/aibika/pathname.rb +158 -0
- data/lib/aibika/version.rb +5 -0
- data/lib/aibika.rb +675 -0
- data/samples/activerecord_sample.rb +6 -0
- data/samples/bundler_git/Gemfile +3 -0
- data/samples/bundler_git/bundler_git.rb +5 -0
- data/samples/mech.rb +8 -0
- data/samples/mime-types_sample.rb +4 -0
- data/samples/pg_sample.rb +4 -0
- data/samples/prawn_sample.rb +9 -0
- data/samples/readchar.rb +4 -0
- data/samples/sysproctable.rb +12 -0
- data/samples/tk.rb +13 -0
- data/samples/tkextlib.rb +4 -0
- data/samples/watir_sample.rb +31 -0
- data/samples/win32_api_sample.rb +5 -0
- data/samples/win32ole.rb +4 -0
- data/samples/wxruby_sample.rbw +29 -0
- data/share/aibika/lzma.exe +0 -0
- data/src/Makefile +37 -0
- data/src/edicon.c +146 -0
- data/src/lzma/LzmaDec.c +1007 -0
- data/src/lzma/LzmaDec.h +223 -0
- data/src/lzma/Types.h +208 -0
- data/src/seb.exe +0 -0
- data/src/stub.c +703 -0
- data/src/stub.rc +1 -0
- data/src/vit-ruby.ico +0 -0
- metadata +109 -0
data/README.adoc
ADDED
@@ -0,0 +1,564 @@
|
|
1
|
+
= Aibika: Ruby applications in a single executable on Windows
|
2
|
+
|
3
|
+
== Purpose
|
4
|
+
|
5
|
+
Aibika packages a Ruby application into a single executable for the Windows
|
6
|
+
platform.
|
7
|
+
|
8
|
+
The resulting executable is self-extracting and self-running, containing:
|
9
|
+
|
10
|
+
* the Ruby interpreter;
|
11
|
+
* packaged Ruby source code; and
|
12
|
+
* any additionally needed Ruby libraries or DLLs.
|
13
|
+
|
14
|
+
NOTE: Aibika was created from the Metanorma-enhanced fork of the
|
15
|
+
https://github.com/larsch/ocra[One-click Ruby Application "Ocra" packager].
|
16
|
+
The first Aibkika version was launched as 1.3.12. The last version of Ocra
|
17
|
+
was 1.3.11 from 2020.
|
18
|
+
|
19
|
+
NOTE: Aibika is considered a temporary solution to the full-fledged
|
20
|
+
functionality of https://github.com/tamatebako/tebako[Tebako], which provides a
|
21
|
+
user-space mounted-disk experience with minimal intervention.
|
22
|
+
|
23
|
+
|
24
|
+
== Supported platforms
|
25
|
+
|
26
|
+
Aibika only supports Windows.
|
27
|
+
|
28
|
+
|
29
|
+
== Supported Ruby versions
|
30
|
+
|
31
|
+
The Aibika packager supports the following versions of Ruby for packaging:
|
32
|
+
|
33
|
+
* 2.7.7
|
34
|
+
* 3.0.6
|
35
|
+
* 3.1.4
|
36
|
+
* 3.2.2
|
37
|
+
|
38
|
+
|
39
|
+
== Features
|
40
|
+
|
41
|
+
* LZMA Compression (optional, default on)
|
42
|
+
* Both windowed/console mode supported
|
43
|
+
* Includes gems based on usage, or from a Bundler Gemfile
|
44
|
+
|
45
|
+
|
46
|
+
== Installation
|
47
|
+
|
48
|
+
[source,sh]
|
49
|
+
----
|
50
|
+
gem install aibika
|
51
|
+
----
|
52
|
+
|
53
|
+
// Stand-alone version: Get abika.rb from
|
54
|
+
// https://github.com/tamatebako/aibika/releases/
|
55
|
+
// Requires nothing but a working Ruby and MinGW installations on Windows
|
56
|
+
|
57
|
+
== Migration from Ocra
|
58
|
+
|
59
|
+
Aibika 1.3.12 is fully compatible with Ocra 1.13.11
|
60
|
+
In order to migrate your build scripts replace ocra invokations with aibika.
|
61
|
+
|
62
|
+
== Synopsis
|
63
|
+
|
64
|
+
=== Building an executable
|
65
|
+
|
66
|
+
[source,sh]
|
67
|
+
----
|
68
|
+
$ aibika script.rb
|
69
|
+
----
|
70
|
+
|
71
|
+
Will package `script.rb`, the Ruby interpreter and all
|
72
|
+
dependencies (gems and DLLs) into an executable named
|
73
|
+
`script.exe`.
|
74
|
+
|
75
|
+
=== Command line
|
76
|
+
|
77
|
+
[source,sh]
|
78
|
+
----
|
79
|
+
$ aibika [options] script.rb [<other files> ...] [-- <script arguments> ...]
|
80
|
+
----
|
81
|
+
|
82
|
+
=== Options
|
83
|
+
|
84
|
+
[source,sh]
|
85
|
+
----
|
86
|
+
$ aibika --help
|
87
|
+
----
|
88
|
+
|
89
|
+
Aibika options:
|
90
|
+
|
91
|
+
[source]
|
92
|
+
----
|
93
|
+
--help Display this information.
|
94
|
+
--quiet Suppress output while building executable.
|
95
|
+
--verbose Show extra output while building executable.
|
96
|
+
--version Display version number and exit.
|
97
|
+
----
|
98
|
+
|
99
|
+
Packaging options:
|
100
|
+
|
101
|
+
[source]
|
102
|
+
----
|
103
|
+
--dll dllname Include additional DLLs from the Ruby bindir.
|
104
|
+
--add-all-core Add all core ruby libraries to the executable.
|
105
|
+
--gemfile <file> Add all gems and dependencies listed in a Bundler Gemfile.
|
106
|
+
--no-enc Exclude encoding support files
|
107
|
+
--allow-self Include self (aibika gem) if detected or specified
|
108
|
+
This option is required only if aibika gem is deployed as a part
|
109
|
+
of broader bundled your solution
|
110
|
+
----
|
111
|
+
|
112
|
+
Gem content detection modes:
|
113
|
+
|
114
|
+
[source]
|
115
|
+
----
|
116
|
+
--gem-minimal[=gem1,..] Include only loaded scripts
|
117
|
+
--gem-guess=[gem1,...] Include loaded scripts & best guess (DEFAULT)
|
118
|
+
--gem-all[=gem1,..] Include all scripts & files
|
119
|
+
--gem-full[=gem1,..] Include EVERYTHING
|
120
|
+
--gem-spec[=gem1,..] Include files in gemspec (Does not work with Rubygems 1.7+)
|
121
|
+
|
122
|
+
--[no-]gem-scripts[=..] Other script files than those loaded
|
123
|
+
--[no-]gem-files[=..] Other files (e.g. data files)
|
124
|
+
--[no-]gem-extras[=..] Extra files (README, etc.)
|
125
|
+
----
|
126
|
+
|
127
|
+
Gem modes:
|
128
|
+
|
129
|
+
* *minimal*: loaded scripts
|
130
|
+
* *guess*: loaded scripts and other files
|
131
|
+
* *all*: loaded scripts, other scripts, other files (except extras)
|
132
|
+
* *full*: Everything found in the gem directory
|
133
|
+
|
134
|
+
File groups:
|
135
|
+
|
136
|
+
* *scripts*: .rb/.rbw files
|
137
|
+
* *extras*: C/C++ sources, object files, test, spec, README
|
138
|
+
* *files*: all other files
|
139
|
+
|
140
|
+
Auto-detection options:
|
141
|
+
|
142
|
+
----
|
143
|
+
--no-dep-run Don't run script.rb to check for dependencies.
|
144
|
+
--no-autoload Don't load/include script.rb's autoloads.
|
145
|
+
--no-autodll Disable detection of runtime DLL dependencies.
|
146
|
+
----
|
147
|
+
|
148
|
+
Output options:
|
149
|
+
|
150
|
+
----
|
151
|
+
--output <file> Name the exe to generate. Defaults to ./<scriptname>.exe.
|
152
|
+
--no-lzma Disable LZMA compression of the executable.
|
153
|
+
--innosetup <file> Use given Inno Setup script (.iss) to create an installer.
|
154
|
+
----
|
155
|
+
|
156
|
+
Executable options:
|
157
|
+
|
158
|
+
----
|
159
|
+
--windows Force Windows application (rubyw.exe)
|
160
|
+
--console Force console application (ruby.exe)
|
161
|
+
--chdir-first When exe starts, change working directory to app dir.
|
162
|
+
--icon <ico> Replace icon with a custom one.
|
163
|
+
--debug Executable will be verbose.
|
164
|
+
--debug-extract Executable will unpack to local dir and not delete after.
|
165
|
+
----
|
166
|
+
|
167
|
+
|
168
|
+
=== Compilation
|
169
|
+
|
170
|
+
* Aibika will load your script (using `Kernel#load`) and build
|
171
|
+
the executable when it exits.
|
172
|
+
|
173
|
+
* Your program should 'require' all necessary files when invoked without
|
174
|
+
arguments, so Aibika can detect all dependencies.
|
175
|
+
|
176
|
+
* DLLs are detected automatically but only those located in your Ruby
|
177
|
+
installation are included.
|
178
|
+
|
179
|
+
* .rb files will become console applications. .rbw files will become
|
180
|
+
windowed application (without a console window popping
|
181
|
+
up). Alternatively, use the `--console` or
|
182
|
+
`--windows` options.
|
183
|
+
|
184
|
+
=== Running your application
|
185
|
+
|
186
|
+
* The 'current working directory' is not changed by Aibika when running
|
187
|
+
your application. You must change to the installation or temporary
|
188
|
+
directory yourself. See also below.
|
189
|
+
* When the application is running, the `AIBIKA_EXECUTABLE` environment
|
190
|
+
variable points to the .exe (with full path).
|
191
|
+
* The temporary location of the script can be obtained by inspected
|
192
|
+
the `$0` variable.
|
193
|
+
* Aibika does not set up the include path. Use `$:.unshift File.dirname($0)`
|
194
|
+
at the start of your script if you need to `require` additional source files
|
195
|
+
from the same directory as your main script.
|
196
|
+
|
197
|
+
=== Pitfalls
|
198
|
+
|
199
|
+
* Avoid modifying load paths at run time. Specify load paths using -I
|
200
|
+
or `RUBYLIB` if you must, but don't expect Aibika to preserve them for
|
201
|
+
runtime. Aibika may pack sources into other directories than you
|
202
|
+
expect.
|
203
|
+
* If you use `.rbw` files or the `--windows` option, then check
|
204
|
+
that your application works with `rubyw.exe` before trying with Aibika.
|
205
|
+
* Avoid absolute paths in your code and when invoking Aibika.
|
206
|
+
|
207
|
+
== Requirements
|
208
|
+
|
209
|
+
* Windows
|
210
|
+
* Working Ruby installation
|
211
|
+
* MinGW Installation
|
212
|
+
|
213
|
+
=== Stand-alone version
|
214
|
+
|
215
|
+
Get aibikasa.rb from http://rubyforge.org/frs/?group_id=8185. Requires
|
216
|
+
nothing but a working Ruby installation on Windows.
|
217
|
+
|
218
|
+
== Technical details
|
219
|
+
|
220
|
+
Aibika first runs the target script in order to detect any files that
|
221
|
+
are loaded and used at runtime (Using `Kernel#require` and
|
222
|
+
`Kernel#load`).
|
223
|
+
|
224
|
+
Aibika embeds everything needed to run a Ruby script into a single
|
225
|
+
executable file. The file contains the .exe stub which is compiled
|
226
|
+
from C-code, and a custom opcode format containing instructions to
|
227
|
+
create directories, save files, set environment variables and run
|
228
|
+
programs. The Aibika script generates this executable and the
|
229
|
+
instructions to be run when it is launched.
|
230
|
+
|
231
|
+
When executed, the Aibika stub extracts the Ruby interpreter and your
|
232
|
+
scripts into a temporary directory. The directory will contains the
|
233
|
+
same directory layout as your Ruby installation. The source files for
|
234
|
+
your application will be put in the 'src' subdirectory.
|
235
|
+
|
236
|
+
=== Libraries
|
237
|
+
|
238
|
+
Any code that is loaded through `Kernel#require` when your
|
239
|
+
script is executed will be included in the Aibika
|
240
|
+
executable. Conditionally loaded code will not be loaded and included
|
241
|
+
in the executable unless the code is actually run when Aibika invokes
|
242
|
+
your script. Otherwise, Aibika won't know about it and will not include
|
243
|
+
the source files.
|
244
|
+
|
245
|
+
RubyGems are handled specially. Whenever a file from a Gem is
|
246
|
+
detected, Aibika will attempt to include all the required files from
|
247
|
+
that specific Gem, expect some unlikely needed files such as readme's
|
248
|
+
and other documentation. This behaviour can be controlled by using the
|
249
|
+
`--gem-*` options. Behaviour can be changed for all gems or specific
|
250
|
+
gems using `--gem-*=gemname`.
|
251
|
+
|
252
|
+
Libraries found in non-standard path (for example, if you invoke Aibika
|
253
|
+
with `ruby -I some/path`) will be placed into the site `dir`
|
254
|
+
(`lib/ruby/site_ruby`). Avoid changing `$LOAD_PATH` or
|
255
|
+
`$:` from your script to include paths outside your source
|
256
|
+
tree, since Aibika may place the files elsewhere when extracted into the
|
257
|
+
temporary directory.
|
258
|
+
|
259
|
+
In case your script (or any of its dependencies) sets up autoloaded
|
260
|
+
module using `Kernel#autoload`, Aibika will automatically try to
|
261
|
+
load them to ensure that they are all included in the
|
262
|
+
executable. Modules that doesn't exist will be ignored (a warning will
|
263
|
+
be logged).
|
264
|
+
|
265
|
+
Dynamic link libraries (`.dll` files, for example `WxWidgets`, or other
|
266
|
+
source files) will be detected and included by Aibika.
|
267
|
+
|
268
|
+
=== Including libraries non-automatically
|
269
|
+
|
270
|
+
If an application or framework is complicated enough that it tends
|
271
|
+
to confuse Aibika's automatic dependency resolution, then you can
|
272
|
+
use other means to specify what needs to be packaged with your app.
|
273
|
+
|
274
|
+
To disable automatic dependency resolution, use the `--no-dep-run`
|
275
|
+
option; with it, Aibika will skip executing your program during the
|
276
|
+
build process. This on the other hand requires using `--gem-full` option
|
277
|
+
(see more below); otherwise Aibika will not include all the necessary
|
278
|
+
files for the gems.
|
279
|
+
|
280
|
+
You will also probably need to use the `--add-all-core` option to
|
281
|
+
include the Ruby core libraries.
|
282
|
+
|
283
|
+
If your app uses gems, then you can specify them in a
|
284
|
+
Bundler Gemfile, then use the --gemfile
|
285
|
+
option to supply it to Aibika. Aibika will automatically include all
|
286
|
+
gems specified, and all their dependencies.
|
287
|
+
|
288
|
+
NOTE: This assumes that the gems are installed in your system,
|
289
|
+
*not* locally packaged inside the app directory by "bundle package".
|
290
|
+
|
291
|
+
These options are particularly useful for packaging Rails
|
292
|
+
applications. For example, to package a Rails 3 app in the
|
293
|
+
directory "someapp" and create an exe named "someapp.exe", without
|
294
|
+
actually running the app during the build, you could use the
|
295
|
+
following command:
|
296
|
+
|
297
|
+
[source,sh]
|
298
|
+
----
|
299
|
+
$ aibika someapp/script/rails someapp --output someapp.exe --add-all-core \
|
300
|
+
--gemfile someapp/Gemfile --no-dep-run --gem-full --chdir-first -- server
|
301
|
+
----
|
302
|
+
|
303
|
+
Note the space between `--` and `server`! It's important; `server` is
|
304
|
+
an argument to be passed to rails when the script is ran.
|
305
|
+
|
306
|
+
Rails 2 apps can be packaged similarly, though you will have to
|
307
|
+
integrate them with Bundler first.
|
308
|
+
|
309
|
+
=== Gem handling
|
310
|
+
|
311
|
+
By default, Aibika includes all scripts that are loaded by your script
|
312
|
+
when it is run before packaging. Aibika detects which gems are using and
|
313
|
+
includes any additional non-script files from those gems, except
|
314
|
+
trivial files such as C/C++ source code, object files, READMEs, unit
|
315
|
+
tests, specs, etc.
|
316
|
+
|
317
|
+
This behaviour can be changed by using the --gem-* options. There are
|
318
|
+
four possible modes:
|
319
|
+
|
320
|
+
* *minimal*: Include only loaded scripts
|
321
|
+
* *guess*: Include loaded scripts and important files (DEFAULT)
|
322
|
+
* *all*: Include all scripts and important files
|
323
|
+
* *full*: Include all files
|
324
|
+
|
325
|
+
If you find that files are missing from the resulting executable, try
|
326
|
+
first with `--gem-all=gemname` for the gem that is missing, and if that
|
327
|
+
does not work, try `--gem-full=gemname`. The paranoid can use `--gem-full`
|
328
|
+
to include all files for all required gems.
|
329
|
+
|
330
|
+
=== Creating an installer for your application
|
331
|
+
|
332
|
+
To make your application start up quicker, or to allow it to
|
333
|
+
keep files in its application directory between runs, or if
|
334
|
+
you just want to make your program seem more like a "regular"
|
335
|
+
Windows application, you can have Aibika generate an installer
|
336
|
+
for your app with the free Inno Setup software.
|
337
|
+
|
338
|
+
You will first have to download and install Inno Setup 5 or
|
339
|
+
later, and also add its directory to your `PATH` (so that Aibika
|
340
|
+
can find the ISCC compiler program). Once you've done that,
|
341
|
+
you can use the `--innosetup` option to Aibika to supply an
|
342
|
+
Inno Setup script. Do not add any `[Files]` or `[Dirs]` sections
|
343
|
+
to the script; Aibika will figure those out itself.
|
344
|
+
|
345
|
+
To continue the Rails example above, let's package the Rails 3
|
346
|
+
app into an installer. Save the following as `someapp.iss`:
|
347
|
+
|
348
|
+
[source,toml]
|
349
|
+
----
|
350
|
+
[Setup]
|
351
|
+
AppName=SomeApp
|
352
|
+
AppVersion=0.1
|
353
|
+
DefaultDirName={pf}\SomeApp
|
354
|
+
DefaultGroupName=SomeApp
|
355
|
+
OutputBaseFilename=SomeAppInstaller
|
356
|
+
|
357
|
+
[Icons]
|
358
|
+
Name: "{group}\SomeApp"; Filename: "{app}\someapp.exe"
|
359
|
+
Name: "{group}\Uninstall SomeApp"; Filename: "{uninstallexe}"
|
360
|
+
----
|
361
|
+
|
362
|
+
Then run this command:
|
363
|
+
|
364
|
+
[source,sh]
|
365
|
+
----
|
366
|
+
$ aibika someapp/script/rails someapp --output someapp.exe --add-all-core \
|
367
|
+
--gemfile someapp/Gemfile --no-dep-run --gem-full --chdir-first --no-lzma \
|
368
|
+
--innosetup someapp.iss -- server
|
369
|
+
----
|
370
|
+
|
371
|
+
If all goes well, a file named "SomeAppInstaller.exe" will be placed
|
372
|
+
into the Output directory.
|
373
|
+
|
374
|
+
=== Environment variables
|
375
|
+
|
376
|
+
Aibika executables clear the `RUBYLIB` environment variable before your
|
377
|
+
script is launched. This is done to ensure that your script does not
|
378
|
+
use load paths from the end user's Ruby installation.
|
379
|
+
|
380
|
+
Aibika executables set the `RUBYOPT` environment variable to the value it
|
381
|
+
had when you invoked Aibika. For example, if you had `"RUBYOPT=rubygems"`
|
382
|
+
on your build PC, Aibika ensures that it is also set on PC's running the
|
383
|
+
executables.
|
384
|
+
|
385
|
+
Aibika executables set `OCRA_EXECUTABLE` to the full path of the
|
386
|
+
executable, for example:
|
387
|
+
|
388
|
+
[source,rb]
|
389
|
+
----
|
390
|
+
ENV["AIBIKA_EXECUTABLE"] # => C:\Program Files\MyApp\MyApp.exe
|
391
|
+
----
|
392
|
+
|
393
|
+
=== Working directory
|
394
|
+
|
395
|
+
The Aibika executable does not change the working directory when it is
|
396
|
+
launched, unless you use the `--chdir-first` option.
|
397
|
+
|
398
|
+
You should not assume that the current working directory when invoking
|
399
|
+
an executable built with .exe is the location of the source script. It
|
400
|
+
can be the directory where the executable is placed (when invoked
|
401
|
+
through the Windows Explorer), the users' current working directory
|
402
|
+
(when invoking from the Command Prompt), or even
|
403
|
+
`C:\\WINDOWS\\SYSTEM32` when the executable is invoked through
|
404
|
+
a file association.
|
405
|
+
|
406
|
+
With the `--chdir-first` option, the working directory will
|
407
|
+
always be the common parent directory of your source files. This
|
408
|
+
should be fine for most applications. However, if your application
|
409
|
+
is designed to run from the command line and take filenames as
|
410
|
+
arguments, then you cannot use this option.
|
411
|
+
|
412
|
+
If you wish to maintain the user's working directory, but need to
|
413
|
+
`require` additional Ruby scripts from the source directory, you can
|
414
|
+
add the following line to your script:
|
415
|
+
|
416
|
+
[source,rb]
|
417
|
+
----
|
418
|
+
$LOAD_PATH.unshift File.dirname($0)
|
419
|
+
----
|
420
|
+
|
421
|
+
=== Load path mangling
|
422
|
+
|
423
|
+
Adding paths to `$LOAD_PATH` or `$:` at runtime is not
|
424
|
+
recommended. Adding relative load paths depends on the working
|
425
|
+
directory being the same as where the script is located (See
|
426
|
+
above). If you have additional library files in directories below the
|
427
|
+
directory containing your source script you can use this idiom:
|
428
|
+
|
429
|
+
[source,rb]
|
430
|
+
----
|
431
|
+
$LOAD_PATH.unshift File.join(File.dirname($0), 'path/to/script')
|
432
|
+
----
|
433
|
+
|
434
|
+
=== Detecting
|
435
|
+
|
436
|
+
You can detect whether Aibika is currently building your script by
|
437
|
+
looking for the 'Aibika' constant. If it is defined, Aibika is currently
|
438
|
+
building the executable from your script. For example, you can use
|
439
|
+
this to avoid opening a GUI window when compiling executables:
|
440
|
+
|
441
|
+
[source,rb]
|
442
|
+
----
|
443
|
+
app = MyApp.new
|
444
|
+
app.main_loop unless defined?(Aibika)
|
445
|
+
----
|
446
|
+
|
447
|
+
=== Additional files and resources
|
448
|
+
|
449
|
+
You can add additional files to the Aibika executable (for example
|
450
|
+
images) by appending them to the command line. They should be placed
|
451
|
+
in the source directory with your main script (or a subdirectory).
|
452
|
+
|
453
|
+
[source,sh]
|
454
|
+
----
|
455
|
+
$ aibika mainscript.rb someimage.jpeg docs/document.txt
|
456
|
+
----
|
457
|
+
|
458
|
+
This will create the following layout in the temporary directory when
|
459
|
+
your program is executed:
|
460
|
+
|
461
|
+
----
|
462
|
+
src/mainscript.rb
|
463
|
+
src/someimage.jpeg
|
464
|
+
src/docs/document.txt
|
465
|
+
----
|
466
|
+
|
467
|
+
Both files, directories and glob patterns can be specified on the
|
468
|
+
command line. Files will be added as-is. If a directory is specified,
|
469
|
+
Aibika will include all files found below that directory.
|
470
|
+
|
471
|
+
Glob patterns (See `Dir.glob`) can be used to specify a specific set of files,
|
472
|
+
for example:
|
473
|
+
|
474
|
+
[source,sh]
|
475
|
+
----
|
476
|
+
$ aibika script.rb assets/**/*.png
|
477
|
+
----
|
478
|
+
|
479
|
+
=== Command Line Arguments
|
480
|
+
|
481
|
+
To pass command line argument to your script (both while building and
|
482
|
+
when run from the resulting executable), specify them after a
|
483
|
+
`--` marker. For example:
|
484
|
+
|
485
|
+
[source,sh]
|
486
|
+
----
|
487
|
+
$ aibika script.rb -- --some-options=value
|
488
|
+
----
|
489
|
+
|
490
|
+
This will pass `--some-options=value` to the script when
|
491
|
+
build and when running the executable. Any extra argument specified by
|
492
|
+
the user when invoking the executable will be appended after the
|
493
|
+
compile-time arguments.
|
494
|
+
|
495
|
+
=== Window/Console
|
496
|
+
|
497
|
+
By default, Aibika builds console application from `.rb` files and
|
498
|
+
windowed applications (without console window) from `.rbw` files.
|
499
|
+
|
500
|
+
Ruby on Windows provides two executables: `ruby.exe` is a console mode
|
501
|
+
application and `rubyw.exe` is a windowed application which does not
|
502
|
+
bring up a console window when launched using the Windows Explorer.
|
503
|
+
By default, or if the `--console` option is used, Aibika will
|
504
|
+
use the console runtime (`ruby.exe`). Aibika will automatically select the
|
505
|
+
windowed runtime when your script has the ".rbw" extension, or if you
|
506
|
+
specify the `--windows` command line option.
|
507
|
+
|
508
|
+
If your application works in console mode but not in windowed mode,
|
509
|
+
first check if your script works without Aibika using `rubyw.exe`. A
|
510
|
+
script that prints to standard output (using puts, print etc.) will
|
511
|
+
eventually cause an exception when run with `rubyw.exe` (when the IO
|
512
|
+
buffers run full).
|
513
|
+
|
514
|
+
You can also try wrapping your script in an exception handler that
|
515
|
+
logs any errors to a file:
|
516
|
+
|
517
|
+
[source,ruby]
|
518
|
+
----
|
519
|
+
begin
|
520
|
+
# your script here
|
521
|
+
rescue Exception => e
|
522
|
+
File.open("except.log") do |f|
|
523
|
+
f.puts e.inspect
|
524
|
+
f.puts e.backtrace
|
525
|
+
end
|
526
|
+
end
|
527
|
+
----
|
528
|
+
|
529
|
+
|
530
|
+
== Credits
|
531
|
+
|
532
|
+
Thanks for Igor Pavlov for the LZMA compressor and decompressor. The
|
533
|
+
source code used was place into Public Domain by Igor Pavlov.
|
534
|
+
|
535
|
+
Erik Veenstra for `rubyscript2exe` which provided inspiration.
|
536
|
+
|
537
|
+
Dice for the default `.exe` icon (`vit-ruby.ico`,
|
538
|
+
http://ruby.morphball.net/vit-ruby-ico_en.html)
|
539
|
+
|
540
|
+
|
541
|
+
== License
|
542
|
+
|
543
|
+
MIT. See link:LICENSE.md[].
|
544
|
+
|
545
|
+
|
546
|
+
== Trivia: origin of name
|
547
|
+
|
548
|
+
Aibika started as a fork of the
|
549
|
+
https://github.com/larsch/ocra[One-click Ruby Application "Ocra" packager].
|
550
|
+
"Ocra" happens to be a wordplay on "okra", the plant name, so the name
|
551
|
+
of the _flower okra_ plant, "aibika" was adopted.
|
552
|
+
|
553
|
+
The _flower okra_ is named as it blooms flowers similar to the okra, and refers to the
|
554
|
+
_https://en.wikipedia.org/wiki/Abelmoschus_manihot[Abelmoschus manihot]_ plant.
|
555
|
+
_Aibika_ refers to the Spanish name of the flower okra.
|
556
|
+
|
557
|
+
Aibika, called トロロアオイ (黄蜀葵, tororoaoi), is a key ingredient to the
|
558
|
+
creation of Washi (和紙, Japanese paper).
|
559
|
+
|
560
|
+
Japanese paper is thin, durable and long-lasting because of its use of aibika.
|
561
|
+
In the manufacturing of Japanese paper, mucus extracted from the root of aibika
|
562
|
+
is used to uniformize the spread of fibers. Without this mucus in the
|
563
|
+
solution, fibers will quickly get excluded from the solution, resulting in
|
564
|
+
fibers not scattered evenly.
|
data/Rakefile
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rubocop/rake_task'
|
5
|
+
require 'minitest/test_task'
|
6
|
+
|
7
|
+
RuboCop::RakeTask.new
|
8
|
+
Minitest::TestTask.create
|
9
|
+
|
10
|
+
task default: %i[test]
|
11
|
+
|
12
|
+
desc 'Build Aibika stubs'
|
13
|
+
task :build_stub do
|
14
|
+
system('mingw32-make -C src')
|
15
|
+
cp 'src/stub.exe', 'share/aibika/stub.exe'
|
16
|
+
cp 'src/stubw.exe', 'share/aibika/stubw.exe'
|
17
|
+
cp 'src/edicon.exe', 'share/aibika/edicon.exe'
|
18
|
+
end
|
19
|
+
|
20
|
+
file 'share/aibika/stub.exe' => :build_stub
|
21
|
+
file 'share/aibika/stubw.exe' => :build_stub
|
22
|
+
file 'share/aibika/edicon.exe' => :build_stub
|
23
|
+
|
24
|
+
task test: :build_stub
|
25
|
+
|
26
|
+
task :clean do
|
27
|
+
rm_f Dir['{bin,samples}/*.exe']
|
28
|
+
rm_f Dir['share/aibika/{stub,stubw,edicon}.exe']
|
29
|
+
system('mingw32-make -C src clean')
|
30
|
+
end
|
data/aibika.gemspec
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'lib/aibika'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'aibika'
|
7
|
+
spec.version = Aibika::VERSION
|
8
|
+
spec.authors = ['Ribose Inc.']
|
9
|
+
spec.email = ['open.source@ribose.com']
|
10
|
+
spec.license = 'MIT'
|
11
|
+
|
12
|
+
spec.summary = 'Ruby applications packager to a single executable on Windows'
|
13
|
+
spec.description = <<~SUM
|
14
|
+
Aibika packages a Ruby application into a single executable for the Windows
|
15
|
+
platform.
|
16
|
+
|
17
|
+
The resulting executable is self-extracting and self-running, containing:
|
18
|
+
|
19
|
+
* the Ruby interpreter;
|
20
|
+
* packaged Ruby source code; and
|
21
|
+
* any additionally needed Ruby libraries or DLLs.
|
22
|
+
|
23
|
+
NOTE: Aibika was created from the Metanorma-enhanced fork of the
|
24
|
+
https://github.com/larsch/ocra[One-click Ruby Application "Ocra" packager].
|
25
|
+
The first Aibkika version was launched as 1.3.12. The last version of Ocra
|
26
|
+
was 1.3.11 from 2020.
|
27
|
+
|
28
|
+
NOTE: Aibika is considered a temporary solution to the full-fledged
|
29
|
+
functionality of https://github.com/tamatebako/tebako[Tebako], which provides a
|
30
|
+
user-space mounted-disk experience with minimal intervention.
|
31
|
+
|
32
|
+
SUM
|
33
|
+
spec.homepage = 'https://github.com/tamatebako/aibika'
|
34
|
+
spec.required_ruby_version = '>= 2.7.0'
|
35
|
+
|
36
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
37
|
+
spec.metadata['source_code_uri'] = 'https://github.com/tamatebako/aibika'
|
38
|
+
|
39
|
+
# Specify which files should be added to the gem when it is released.
|
40
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
41
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
42
|
+
`git ls-files --recurse-submodules -z`.split("\x0").reject do |f|
|
43
|
+
(f == __FILE__) ||
|
44
|
+
f.match(%r{\A(?:(?:test)/|\.(?:git|cirrus|autotest|rubocop))})
|
45
|
+
end
|
46
|
+
end
|
47
|
+
spec.bindir = 'bin'
|
48
|
+
spec.executables = spec.files.grep(%r{\Abin/}) { |f| File.basename(f) }
|
49
|
+
spec.require_paths = %w[bin lib samples share src]
|
50
|
+
end
|
data/bin/aibika
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'English'
|
5
|
+
require_relative '../lib/aibika'
|
6
|
+
|
7
|
+
if File.basename(__FILE__) == File.basename($PROGRAM_NAME)
|
8
|
+
Aibika.init(ARGV)
|
9
|
+
ARGV.replace(Aibika.arg)
|
10
|
+
|
11
|
+
Aibika.fatal_error "#{Aibika.files[0]} was not found!" unless Aibika.files.first.exist?
|
12
|
+
|
13
|
+
at_exit do
|
14
|
+
if $ERROR_INFO.nil? || $ERROR_INFO.is_a?(SystemExit)
|
15
|
+
Aibika.build_exe
|
16
|
+
exit 0
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
if Aibika.run_script
|
21
|
+
Aibika.msg 'Loading script to check dependencies'
|
22
|
+
$0 = Aibika.files.first
|
23
|
+
load Aibika.files.first
|
24
|
+
end
|
25
|
+
end
|