【问题标题】:Make shell does not inherit console shell environment variablesMake shell 不继承控制台 shell 环境变量
【发布时间】: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 的环境变量。这对我来说是个问题,因为我使用rvmrvm 使用一些环境变量来选择正确的宝石。我使用.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 太聪明了,不允许这么简单的事情发生。

【问题讨论】:

    标签: ruby shell makefile rvm


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      首先,我在 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 不起作用。作为续集,rvm 也不起作用,我会收到那个恼人的消息说

      rvm 不是函数

      然后我添加了

      SHELL = /bin/bash
      

      就在.ONESHELL: 指令之后。

      现在一切正常!

      【讨论】:

        猜你喜欢
        • 2023-04-04
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多