【问题标题】:Install makefile on Heroku application在 Heroku 应用程序上安装 makefile
【发布时间】:2017-03-15 13:41:01
【问题描述】:

我有一个在 Heroku 上运行的 Rails 应用程序。我的应用程序调用通过 Makefile 安装的 CLI 工具(在我的本地计算机上)。我需要在我的 Heroku 应用程序上安装这个 Makefile,以便我的所有应用程序实例都可以使用它。

如何让 heroku 在部署时安装这个 makefile?我可以通过在其配置文件中传递一些预部署参数来在 CircleCI 上完成此操作:

cd vendor/liblouis ; ./configure ; make ; sudo make install

Heroku 是否提供类似的功能? 我寻求他们的支持,但他们向我指出了一些用于 makefile 的 buildpack。这行不通(我认为),因为它不允许我运行 ./configure

【问题讨论】:

    标签: heroku


    【解决方案1】:

    我认为这是可行的,但需要一些工作,并且很难为您提供直接的解决方案。您绝对应该使用 buildpack 并在构建阶段编译所有内容。我找到了this buildpack。我不知道这是否是推荐的,但这可能是一个很好的起点。

    确实它不会运行configure,但你实际上可以分叉它并以你想要的方式修改它。您只需要聪明地配置所有路径。安装在/usr/bin 或类似的东西是行不通的。此外,您可能应该使用make install 而不是sudo make install

    在这个 buildpack 中,您可以访问 3 个目录:build、cache 和 env。您需要在构建目录中安装您的可执行文件或库。

    我相信你可以在修改这个 buildpack 之前在一次性测功机上进行练习。只需运行 heroku run bash 并尝试编译您的 Makefile。

    【讨论】:

    • 我可以在测功机heroku run bash 上运行它,并且该应用程序运行正常。我用相同的命令组合了一个构建包,我可以看到在部署过程中它安装正确。当我heroku run bash 并尝试启动 CLI 工具时,它说它缺少共享库。我不知道如何让每个实例链接到共享库...
    【解决方案2】:

    所以我能够得到这个工作,但必须创建我自己的自定义 buildpack。 Buildpacks 比我想象的要简单得多,但是我分叉了一个现有的并对其进行了编辑以适用于我的情况。我将我的 makefile 存储在我的应用程序的 vendor 目录中。

    在 buildpack 中,我有以下代码:

    #!/usr/bin/env bash
    # bin/compile <build-dir> <cache-dir>
    
    set -e
    set -o pipefail
    
    BUILD_DIR=$1
    CACHE_DIR=$2
    
    function indent() {
      c='s/^/       /'
      case $(uname) in
        Darwin) sed -l "$c";;
        *)      sed -u "$c";;
      esac
    }
    
    cd $BUILD_DIR/vendor/liblouis
    
    # autoreconfig
    echo "-----> Running autoreconfig"
      autoreconf -f -i  2>&1 | indent
    
    # configure
    if [ -f configure ]; then
      echo "-----> Configuring"
      ./configure --prefix=$BUILD_DIR/vendor/liblouis-exec 2>&1 | indent
    fi
    
    # make
    echo "-----> Compiling with Make"
    make 2>&1 | indent
    
    # make install
    echo "-----> Installing with Make"
    make install 2>&1 | indent
    

    我将 buildpack 推送到我自己的 repo,然后将 buildpack 添加到我的 heroku 应用程序中 heroku buildpacks:add https://github.com/KidA001/heroku-buildpack-c

    我还必须在我的应用程序的根目录中创建一个.profile 文件添加一个指向需要链接到共享库的文件的链接

    .profile

    export LD_LIBRARY_PATH=$HOME/vendor/liblouis-exec/lib
    

    现在我可以调用安装在这个 buildpack 中的这个 CLI 工具,它可以在我在 heroku 上的所有应用实例上使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 2013-01-02
      相关资源
      最近更新 更多