makeshell不继承consoleshell环境变量
Make shell does not inherit console shell environment variables
我正在使用 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 的环境变量。这对我来说是个问题,因为我使用 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
:
时收到以下错误
Your Ruby engine is ruby, but your Gemfile specified jruby
据我所知 rvm
(而且我非常了解),这意味着它正在尝试使用我的默认 Ruby 版本(设置为 Ruby 2.5 .0) 作为引擎,而不是正确的 JRuby 版本。
现在,这是我的问题:有没有办法强制 make inner 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
太聪明了,不允许像这样简单的事情发生。
首先,我在 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),而不必在控制台上永久更改它。
碰巧这行不通,因为我没有选择我正在使用的 shell 并且由于某种原因它似乎不是 /bin/bash
而 source
不会工作。作为 sequel,rvm
也不起作用,我会收到令人恼火的消息
rvm is not a function
然后我添加了
SHELL = /bin/bash
在 .ONESHELL:
指令之后。
现在一切正常!
我认为有两个问题:
1) 当 rvm
创建它的环境变量时,它不会 export
它们,所以它们对 child shells 是不可见的,并且
2) 因为 child shell 不是作为登录 shell 启动的,它不会看到和处理 rvm
函数声明,因此不能执行 rvm my-ruby-version
.
这里有几个解决方法:
在创建 child shell 之前,执行如下操作:
export RVM_VERSION=`rvm current`
启动 child shell 时,请在登录模式下进行:
zsh --login
或
bash --login
那么,rvm 应该是一个函数,这应该可以工作:
rvm $RVM_VERSION
我正在使用 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 的环境变量。这对我来说是个问题,因为我使用 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
:
Your Ruby engine is ruby, but your Gemfile specified jruby
据我所知 rvm
(而且我非常了解),这意味着它正在尝试使用我的默认 Ruby 版本(设置为 Ruby 2.5 .0) 作为引擎,而不是正确的 JRuby 版本。
现在,这是我的问题:有没有办法强制 make inner 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
太聪明了,不允许像这样简单的事情发生。
首先,我在 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),而不必在控制台上永久更改它。
碰巧这行不通,因为我没有选择我正在使用的 shell 并且由于某种原因它似乎不是 /bin/bash
而 source
不会工作。作为 sequel,rvm
也不起作用,我会收到令人恼火的消息
rvm is not a function
然后我添加了
SHELL = /bin/bash
在 .ONESHELL:
指令之后。
现在一切正常!
我认为有两个问题:
1) 当 rvm
创建它的环境变量时,它不会 export
它们,所以它们对 child shells 是不可见的,并且
2) 因为 child shell 不是作为登录 shell 启动的,它不会看到和处理 rvm
函数声明,因此不能执行 rvm my-ruby-version
.
这里有几个解决方法:
在创建 child shell 之前,执行如下操作:
export RVM_VERSION=`rvm current`
启动 child shell 时,请在登录模式下进行:
zsh --login
或
bash --login
那么,rvm 应该是一个函数,这应该可以工作:
rvm $RVM_VERSION