【发布时间】:2018-01-17 21:27:48
【问题描述】:
我正在使用 Makefile 来构建一个应用程序,其中前端和后端完全分开在两个不同的目录中,例如:
- myapp
|_be
|_fe
这是我的 Makefile:
.ONESHELL:
all: frontend backend
frontend:
cd ./fe && \
npm install && \
./node_modules/webpack/bin/webpack.js
backend: clean
cd ./be && \
gem install bundler && \
bundle install
clean:
rm -f ./fe/public/bundle.js && rm -rf ./fe/public/resources
webpack:
cd ./fe && \
.node_modules/webpack/bin/webpack.js
test:
cd ./fe && \
npm test
run:
cd ./be && \
rackup config.ru
前端是一个 React 应用程序,当我输入 make frontend 时,它正在正确构建。这里没有问题。
但后端是一个用 Ruby 编写的 Rack 应用程序。在构建过程中,我需要进入其目录(be),确保已安装捆绑程序并运行bundle install。
make 碰巧创建了自己的 shell 来运行 Makefile 命令。而且这个 shell 不会继承我正在工作的控制台 shell 的环境变量。这对我来说是个问题,因为我使用rvm 和rvm 使用一些环境变量来选择正确的宝石。我使用.ruby-gemset 和.ruby-version 为我的应用程序创建一个私有包,而不是使用默认的gemset。这是必要的,因为我的应用程序使用许多不同的 Ruby 版本并且不想关心这个。
此特定应用程序使用 JRuby 9.1.7.0,然后我的 Gemfile(在 be 目录内)具有以下行:
ruby '2.3.1', :engine => 'jruby', :engine_version => '9.1.7.0'
我注意到所有这些问题,因为我在输入 make backend 时收到以下错误:
你的 Ruby 引擎是 ruby,但是你的 Gemfile 指定了 jruby
据我所知rvm(我非常了解),这意味着它正在尝试使用我的默认 Ruby 版本(设置为 Ruby 2.5.0)作为引擎,而不是正确的 JRuby 版本.
现在,这是我的问题:有没有办法强制 make 内壳使用与我正在使用的控制台外壳相同的配置?
这将解决问题,因为控制台 shell 已由 rvm 配置。我知道这是因为当我手动进入be 目录并在其中运行bundle install 时,一切正常。
我使用.ONESHELL 指令强制make 执行此操作,但似乎不是我需要的。
建议?
编辑: make documentation 表示-e 标志可用于强制make 获取所有控制台shell 变量。我试过了,还是不行。
编辑:如果我这样做,一切都会有效
rvm use --default jruby-9.1.7.0
在做我的make backend之前。但是由于许多原因,这样做并不方便。此外,我真的相信这是一种更好的方法。 make 太聪明了,不允许这么简单的事情发生。
【问题讨论】: