프로덕션 환경에서 플러그인에 `eth` 지니 설치 중 어려움

플러그인에서 eth 지엄을 설치해야 하는데, 이게 정말 어렵네요. 이 지엄은 여러 다른 지엄에 의존하고 있고, 그중 일부는 네이티브 확장 기능이 있습니다. 시도해 보시겠다면 의존성 목록을 아래에 첨부합니다.

gem 'pkg-config', '1.4.7', require: false
gem 'mkmfmf', '0.4', require: false
gem 'keccak', '1.3.0', require: false
gem 'zip', '2.0.2', require: false
gem 'mini_portile2', '2.7.0', require: false
gem 'rbsecp256k1', '5.1.0', require: false
gem 'konstructor', '1.0.2', require: false
gem 'ffi', '1.15.5', require: false
gem 'ffi-compiler', '1.0.1', require: false
gem 'scrypt', '3.0.7', require: false
gem 'eth', '0.5.1', require: false
gem 'siwe', '1.0.0', require: false

문제는 rbsecp256k1입니다. 네이티브 확장 기능을 빌드하기 위해 mini_portile2를 요구하는데, 설치되어 있고 require되어 있음에도 불구하고 찾을 수 없다고 합니다. 지엄을 포크해서 절대 경로를 수동으로 require하는 시도도 해보고, mini_portile2를 rbsecp256k1에 그대로 클론해서 거기서 require하는 시도도 해봤지만, 아직까지 아무것도 해결되지 않았습니다.

도움을 주시면 정말 감사하겠습니다.

드디어 우회 방법을 찾았습니다. 잠시 후 공유하겠습니다.

다음과 같이 진행했습니다. 서버에 로그인한 후 docker 컨테이너에 진입했습니다.

  • gems라는 이름의 폴더를 생성합니다.

  • 하위 디렉터리 2.7.5를 생성합니다(tests-passed에서 프로덕션 discourse가 사용하는 ruby 버전).

  • gems 폴더로 다시 이동합니다.

  • 다음과 같은 방식으로 명령어를 실행합니다.

    RUBY_VERSION=2.7.5
    gem install pkg-config -v 1.4.7 -i $RUBY_VERSION --no-document --ignore- 
    dependencies --no-user-install
    gem install mkmfmf -v 0.4 -i $RUBY_VERSION --no-document --ignore-dependencies 
    --no-user-install
    ...
    

    참고: 이 명령어들은 discourse가 gem을 설치하려고 실행하는(실패하는) 것과 정확히 동일한 명령어입니다.

  • 이제 이 폴더를 zip으로 압축합니다.

  • docker 컨테이너에서 나와서 docker cp 명령어를 사용하여 zip 파일을 컨테이너 외부로 복사합니다.

  • filezilla 또는 vscode를 사용하여 서버에 연결하고 zip 파일을 다운로드합니다.

  • 플러그인의 루트 폴더에 압축을 풉니다. 그러면 플러그인 폴더에 gems 디렉터리가 포함됩니다.

  • 이제 플러그인과 함께 gems 폴더를 github에 push합니다.

이제 이 플러그인으로 discourse를 다시 빌드하면, discourse가 제공한 의존성을 사용하고 설치하려고 시도하지 않습니다. 이것은 임시 해결책이며, discourse가 ruby 버전을 업데이트하면 다시 수행해야 합니다.

그러나 가장 큰 질문은, 터미널에서 실행할 때는 작동하는 동일한 명령어가 discourse가 실행하려고 할 때 왜 실패하는지입니다. 이 문제를 조사해 보는 것이 매우 가치가 있으며, 간단한 해결책이 있기를 바랍니다.

최근에 이 문제를 수정했습니다.

좋아요, 감사합니다. :clap:

이 수정 사항을 stable 브랜치에 체리픽해 주실 수 있을까요 @tgxworld ?

다음에서 완료했습니다: