Opal ruby Rake任务失败,出现错误FrozenError:无法修改冻结的数组

goqiplq2  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(100)

在我的Web应用程序中,我试图使用Opal来编程Javascript。

ruby-3.1.2
opal-1.7.3
opal-jquery 0.4.6

我使用guard-rake来自动编译对我的蛋白石文件所做的任何更改。以下是相关的代码片段:

Rakefile

require 'opal'
require 'opal-jquery'

namespace :opal do
  desc "Compile Opal files"
  task :compile do
    Opal.append_path "app/assets/opal"

    builder = Opal::Builder.new
    builder.build('opal')
    builder.build('opal-jquery')
    builder.build("main")

    File.binwrite "app/assets/js/opal-main.js", builder.to_s
  end
end

守护文件

group :server do
  guard "puma", port: 2300 do
    watch(%r{config/*})
    watch(%r{lib/*})
    watch(%r{app/*})
  end

  guard 'rake', :task => 'opal:compile' do
    watch(%r{^app/assets/opal/.+\.rb})
  end
end

当我启动服务器时,rake任务成功运行,编译也成功。服务器日志如下所示

15:31:07 - INFO - Using Guardfile at /.../myapp/Guardfile.
15:31:07 - INFO - Puma starting on port 2300 in development environment.
15:31:07 - INFO - Starting guard-rake opal:compile
[23559] Puma starting in cluster mode...
[23559] * Puma version: 6.2.2 (ruby 3.1.2-p20) ("Speaking of Now")
[23559] *  Min threads: 5
[23559] *  Max threads: 5
[23559] *  Environment: development
[23559] *   Master PID: 23559
[23559] *      Workers: 2
[23559] *     Restarts: (✔) hot (✖) phased
[23559] * Preloading application
15:31:08 - INFO - running opal:compile
15:31:08 - INFO - Guard is now watching at '/.../myapp'
[23559] * Listening on http://0.0.0.0:2300
[23559] Use Ctrl-C to stop
[23559] * Starting control server on http://127.0.0.1:9293
[23559] * Starting control server on http://[::1]:9293
[23559] - Worker 0 (PID: 23579) booted in 0.0s, phase: 0
[23559] - Worker 1 (PID: 23581) booted in 0.0s, phase: 0

然后,当我对附加到Opal的路径app/assets/opal下的任何文件进行更改时,guard-rake运行任务以重新编译该路径下的Opal文件,但在服务器日志中,我看到以下错误

15:32:13 - ERROR - Guard::Rake failed to run rake task <opal:compile>, exception was:
> [#]   FrozenError: can't modify frozen Array: ["/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-1.7.3/opal", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-1.7.3/stdlib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-1.7.3/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/ast-2.4.2/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/ast-2.4.2/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/parser-3.2.2.1/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-jquery-0.4.6/lib", "app/assets/opal"]

完整日志如下所示

15:32:13 - INFO - Restarting Puma...
[23559] - Gracefully shutting down workers...
15:32:13 - INFO - Puma restarted
15:32:13 - INFO - running opal:compile
15:32:13 - ERROR - Guard::Rake failed to run rake task <opal:compile>, exception was:
> [#]   FrozenError: can't modify frozen Array: ["/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-1.7.3/opal", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-1.7.3/stdlib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-1.7.3/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/ast-2.4.2/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/ast-2.4.2/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/parser-3.2.2.1/lib", "/home/jignesh/.rvm/gems/ruby-3.1.2@myapp/gems/opal-jquery-0.4.6/lib", "app/assets/opal"]
[23559] * Restarting...
[23559] Puma starting in cluster mode...
[23559] * Puma version: 6.2.2 (ruby 3.1.2-p20) ("Speaking of Now")
[23559] *  Min threads: 5
[23559] *  Max threads: 5
[23559] *  Environment: development
[23559] *   Master PID: 23559
[23559] *      Workers: 2
[23559] *     Restarts: (✔) hot (✖) phased
[23559] * Preloading application
[23559] * Inherited tcp://0.0.0.0:2300
[23559] Use Ctrl-C to stop
[23559] * Starting control server on http://127.0.0.1:9293
[23559] * Starting control server on http://[::1]:9293
[23559] - Worker 0 (PID: 23926) booted in 0.0s, phase: 0
[23559] - Worker 1 (PID: 23928) booted in 0.0s, phase: 0

有没有人可以帮助找出导致rake任务失败的问题是什么?
我定义rake任务的方式有问题吗?
注:我是新手蛋白石,所以请忍受任何错误,这看起来很傻的Maven。
谢谢

7xzttuei

7xzttuei1#

原因很简单。
编译后不能执行Opal.append_path "app/assets/opal"。如果任务被执行多次,这可能会发生,这似乎是一种情况。你需要把那条线移到耙块外面。
另外,我建议使用opal-browser而不是opal-jquery

相关问题