使shell不继承控制台shell环境变量

时间:2018-01-17 21:27:49

标签: ruby shell makefile rvm

我正在使用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),确保已安装bundler并运行bundle install

恰好make创建了自己的shell来运行Makefile命令。而且这个shell不会继承我正在使用的控制台shell的环境变量。这对我来说是一个问题,因为我使用rvmrvm使用一些环境变量来选择正确的宝石。我使用.ruby-gemset.ruby-version为我的应用程序创建一个私有包,而不是使用默认的gemset。这是必要的,因为我有使用许多不同Ruby版本的应用程序,并且不想关心它。

此特定应用程序使用JRuby 9.1.7.0,然后我的Gemfilebe目录内)具有以下行:

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使用我正在使用的控制台shell的相同配置?

这可以解决问题,因为控制台shell已由rvm配置。我知道这是因为当我手动进入be目录并在其中运行bundle install时,一切都很顺利。

我使用.ONESHELL指令强制make执行此操作,但似乎这不是我需要的。

建议?

编辑: make documentation表示-e标志可用于强制make获取所有控制台shell变量。我尝试了它并没有用。

编辑:如果我这样做就行了

rvm use --default jruby-9.1.7.0

在做make backend之前。但由于种种原因,这样做并不方便。此外,我真的相信这是一个更好的方法。 make过于聪明,不允许像这样简单的事情。

2 个答案:

答案 0 :(得分:1)

我相信有两个问题:

1)当rvm创建其环境变量时,它不会export它们,因此它们对子shell不可见,并且

2)因为子shell未作为登录shell启动,所以它不会查看和处理rvm函数声明,因此无法执行rvm my-ruby-version

以下是一些解决方法:

在创建子shell之前,请执行以下操作:

export RVM_VERSION=`rvm current`

启动子shell时,请在登录模式下执行此操作:

zsh --login

bash --login

然后,rvm应该是一个函数,这应该有效:

rvm $RVM_VERSION

答案 1 :(得分:0)

首先,我在我的backend:食谱中添加了两行,现在正在阅读

backend:
    cd ./be && \
    source $(HOME)/.rvm/scripts/rvm && \
    rvm use jruby-9.1.7.0 && \
    gem install bundler && \
    bundle install

这个想法是设置正确的Ruby(JRuby 9.1.7.0),而不必在控制台上永久更改它。

发生这种情况不会起作用,因为我没有选择我正在使用的外壳,而且似乎由于某种原因它不会/bin/bashsource不会#39;工作。作为续集,rvm也不会工作,我会收到一条令人恼火的消息说

  

rvm不是函数

然后我添加了

SHELL = /bin/bash

.ONESHELL:指令之后。

现在一切正常!