首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Make不继承控制台shell环境变量。

Make不继承控制台shell环境变量。
EN

Stack Overflow用户
提问于 2018-01-17 21:27:48
回答 2查看 317关注 0票数 2

我正在开发一个Makefile来构建一个应用程序,其中前端和后端完全分离在两个不同的目录中,例如:

代码语言:javascript
运行
复制
- myapp
  |_be
  |_fe

这是我的Makefile

代码语言:javascript
运行
复制
.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

前端是一个反应性应用程序,当我输入make frontend时,它是正确构建的。这里没有问题。

但是后端是用Ruby编写的Rack应用程序。在构建过程中,我需要输入它的目录(be),确保安装了邦德勒并运行bundle install

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

这个特定的应用程序使用JRuby 9.1.7.0,然后我的Gemfile (在be目录中)有以下一行:

代码语言:javascript
运行
复制
ruby '2.3.1', :engine => 'jruby', :engine_version => '9.1.7.0'

我注意到了所有这些问题,因为我输入make backend时出现了以下错误

您的Ruby引擎是ruby,但是您的Gemfile指定了jruby

就我所知的rvm (而且我非常了解它)而言,这意味着它试图使用我的默认JRuby版本(它被设置为Ruby2.5.0)作为引擎,而不是正确的JRuby版本。

现在,我的问题是:是否有一种方法可以强制make内部shell使用与我使用的控制台外壳相同的配置?

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

我使用.ONESHELL指令强制make这样做,但这似乎不是我所需要的。

有什么建议吗?

编辑: make 文档-e标志可以用来强制make抓取所有控制台外壳变量。我试过了但没成功。

编辑:如果我这样做的话,所有的都能工作

代码语言:javascript
运行
复制
rvm use --default jruby-9.1.7.0

在做make backend之前。但是,由于许多原因,这样做并不方便。另外,我真的认为这是一个更好的方法。make太聪明了,不能允许像这样简单的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-19 10:52:59

我相信有两个问题:

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

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

以下是一些解决办法:

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

代码语言:javascript
运行
复制
export RVM_VERSION=`rvm current`

启动子shell时,请在登录模式下这样做:

代码语言:javascript
运行
复制
zsh --login

代码语言:javascript
运行
复制
bash --login

然后,rvm应该是一个函数,这应该是可行的:

代码语言:javascript
运行
复制
rvm $RVM_VERSION
票数 2
EN

Stack Overflow用户

发布于 2018-01-17 23:09:39

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

代码语言:javascript
运行
复制
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/bashsource无法工作。作为续集,rvm也不起作用,我会收到那条恼人的信息

rvm不是一个函数。

然后我又说

代码语言:javascript
运行
复制
SHELL = /bin/bash

就在.ONESHELL:指令之后。

现在一切都很好!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48310275

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档