如何缩小Ruby源文件?

我有一种情况,我希望能够缩小 (不编译)Ruby脚本。 目标是:

  1. 减少脚本的整体字符数;
  2. 执行一定程度的混淆,使其他人难以修改代码。

我们可以假设:

  1. 是的,我知道我在做什么,而且我确实想要缩小和混淆代码。
  2. 源Ruby代码具有简单的语法,并且不使用任何高级元编程技术等。

是否有任何现有的库或工具? 如果没有,开始开发一个简单的minifier(理想情况下,也用Ruby编写)的最佳方法是什么?

我创建了一个简单的脚本,它读取一个Ruby文件,生成一个缩小和混淆的版本,然后解释输出再次重新生成它 。 我创建了一个Ruby文件并使用命令扩展来运行可以使用ruby main.rb执行的Shell脚本:

main.rb的

 class MinifyAndObfuscateRuby def initialize(shell_script="./main.sh") @shell_script = shell_script run_shell_script end private def run_shell_script %x[sh #{@shell_script}] end end 

我编写了Shell脚本,它接受输入的Ruby源文件并根据输入生成输出文件。 您可以选择直接使用sh main.sh运行它(而不是使用我为RSpec测试添加的main.rb包装器)。 请注意,存储库中共享的大多数main.sh代码如下所示,但为了简洁起见,我省略了recover_source函数的详细信息,该函数尝试在第二个输出文件中重新生成原始Ruby源文件。

main.sh

 #!/bin/bash # Purpose: Simple script that reads a Ruby file, generates a minified and # obfuscated version, and then interprets the output to regenerate it again. # Execute either by running `main.rb` Ruby file (uses command expansion to run this Shell script) # with `ruby main.rb` or with directly with `sh main.sh`. Outputs are automatically # generated in an ./outputs subdirectory. # declare and instantiate variables MINLEN=0 # optionally exclude iteration of blank lines when MINLENGTH is 1 input_file="./source.rb" reverse="" output_file="./outputs/output_minified_and_obfuscated.min.rb" output_file_recovered="./outputs/output_unminified_and_unobfuscated.rb" # obfuscate: by reversing each line function obfuscate { for (( i=$len-1; i>=0; i-- )); do reverse="$reverse${line:$i:1}" done reverse+="\n" } # minify: find instances of the tuple keys in the variable containing the # reversed input file string and replace with respective tuple values function minify { find_data='eriuqer;*r* fed;*d* dne;*e* edulcni;*i* ssalc;*c* redaer_rtta;*ar*'; for tuple in $find_data; do key=$(echo $tuple | cut -d ';' -f 1); value=$(echo $tuple | cut -d ';' -f 2); reverse=${reverse/$key/$value} done } function process_source { # read lines from input file while IFS= read -r line || [ -n "$line" ]; do len=${#line} if [ "$len" -ge "$MINLEN" ]; then obfuscate minify fi done < "$input_file" echo "$output_file not found. Creating $output_file and adding minified and obfuscated contents" ! [[ -d "outputs" ]] && mkdir outputs touch $output_file echo $reverse >> $output_file } # check if output Ruby file already exists and if so regenerate source, otherwise create it if [ -f "$output_file" ] && ! [ -f "$output_file_recovered" ]; then echo "$output_file already exists." recover_source # see source code for details of this method exit 0 elif [ -f "$input_file" ] && ! [ -f "$output_file_recovered" ]; then process_source exit 0 else echo "$output_file and $output_file_recovered have both already been generated." echo "Deleted temporary files and restarting process..." [ -f "$output_file" ] && rm -f "$output_file" [ -f "$output_file_recovered" ] && rm -f "$output_file_recovered" [ -d "outputs" ] && rmdir outputs exit 0 fi 

我使用的示例源代码文件如下所示:

source.rb

 require 'bigdecimal' class Obfiscate include Comparable attr_reader :name def initialize(name) @name = name end end 

它通过反转源文件中的每一行来应用一定程度的混淆,并使用正则表达式将Ruby语法替换为我自己的自定义缩写( attr_accessor *ar* require替换为*r* ,将class替换为*c* ,将attr_accessor*ar*def with *d* ,以*e* end ,以减少整体字符数,并可选择删除空行,如下面的示例输出所示:

./outputs/output_minified_and_obfuscated.min.rb

 'lamicedgib' *r* etacsifbO *c* elbarapmoC eman: *ar* )eman(ezilaitini *d* eman = eman@ *e* *e*