我正在尝试打包rails(3.2)应用程序以在Windows机器上运行,我正在使用OCRA将应用程序“编译”到exe中。在我的桌子上反复敲打我的头后,我设法让应用程序编译并运行,但我还有一个问题;应用程序的数据库也打包在.exe中,因此当应用程序运行和运行(可以创建和检索新记录)时,它只是暂时的,当exe停止时,对数据库的任何更改都将丢失。
所以我想我需要做的是让数据库在应用程序外部,因此它将在exe的外部。但我还没有成功做到这一点。我已经尝试将database.yml中的数据库路径更改为几个不同的值,但我没有尝试过。我看到的连接到外部数据库的示例都显示连接是远程主机而不是本地文件 我想要的是数据库文件与exe文件在同一文件夹中。
已编译的应用程序在生产模式下运行,这是我用来构建exe的ocra命令;
ocra myapp\script\rails myapp --add-all-core --gemfile myapp\Gemfile --no-dep-run --gem-full --chdir-first -- server -e production
database.yml与创建应用程序后基本相同
production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000
我已经尝试将database:
设置为production.sqlite
和../production.sqlite
,然后将数据库文件放在与编译的exe相同的文件夹中,然后再运行它,但是没有用。
我对设置不同的数据库非常不熟悉,所以我确信我在这里缺少一些关键点!
答案 0 :(得分:4)
我终于在google-groups discussion中找到了关于另一个与ORCA相关的问题的答案,它恰好包含了我需要的database.yml配置。
要使数据库位于OCRA编译的exe外部,以使数据库文件与.exe位于同一目录中,请将database.yml中的database:
参数设置为此;
<%= File.expand_path('../production.sqlite3', ENV["OCRA_EXECUTABLE"]) %>
我编译的应用程序在生产模式下运行,所以现在这是我的database.yml的那部分看起来;
production:
adapter: sqlite3
database: <%= File.expand_path('../production.sqlite3', ENV["OCRA_EXECUTABLE"]) %>
pool: 5
timeout: 5000
现在这个工作完美,我可以运行app.exe在数据库中创建一个新条目,然后终止app.exe。当我再次运行app.exe时,对数据的更改仍然存在。