web-dev-qa-db-fra.com

Comment utiliser Bundler avec un fichier .gem hors connexion?

Pour mon application, je dois gérer les fichiers Zip cryptés. En dépit de leur site à la recherche horrible, il semble que le commercial Zip gem de Chilkat soit probablement le meilleur moyen d’appliquer cela.

Comme il s'agit d'un joyau commercial, ils ne l'ont dans aucune des sources de gemmes typiques que Bundler examine. J'ai pu installer la version Linux 64 bits de la gem sous Mac OS X (bien que je n'aie pas encore essayé de l'exécuter, il n'y a donc pas encore Word si cela fonctionnera réellement). Cependant, j'essaie d'abord de faire en sorte que Bundler reconnaisse et charge le gem à partir du fichier .gem que j'ai téléchargé.

Bundler a un attribut path que j'ai essayé d'utiliser de plusieurs manières, mais je ne l'ai pas encore fait fonctionner:

  1. J'ai essayé d'utiliser path pour désigner le fichier .gem lui-même, mais path attend un répertoire.
  2. J'ai essayé d'ajouter .gz à la fin du fichier .gem et de l'extraire. J'ai un répertoire contenant un fichier data.tar.gz et metadata.gz. path pointait vers le répertoire extrait avec ces deux fichiers ne fonctionnait pas.
  3. J'ai essayé d'extraire les fichiers data.tar.gz et metadata.gz et de placer les versions extraites dans le répertoire vers lequel j'ai pointé le chemin. Cela a échoué.
  4. J'ai remarqué que la gemme n'avait pas de fichier gemspec - j'en ai créé un et l'ai placé à l'intérieur du répertoire. Pas de chance.

C'est l'erreur que je reçois:

$ bundle install
Fetching source index for http://rubygems.org/
Fetching source index for http://gems.github.com/
Could not find gem 'chilkat (>= 0, runtime)' in source at /Users/username/appname/vendor/cache/chilkat-9.1.0-x86_64-linux.
Source does not contain any versions of 'chilkat (>= 0, runtime)'

Des idées sur la façon dont je peux faire en sorte que Bundler voie que la gemme est bien dans ce répertoire? Des options autres que l'attribut path qui ne semble pas fonctionner?

Merci beaucoup!

33
shedd

J'utilise Rails 3.0.3, nouvelle version de Rails 3 et bundler.

J'ai eu la même erreur avec:

gem 'mygem', :path => '/path/to/gem'

Résolu en spécifiant le numéro de version:

gem 'mygem', '0.0.1', :path => '/path/to/gem'

L'utilisation de >=0.0.1 pour la version a permis de revenir à l'erreur d'origine. Je ne peux pas expliquer cela, cependant.

Citant le commentaire utile de JD, extrait de la page de manuel Gemfile: "Semblable à la sémantique de l’option: git, l’option: path exige que le répertoire en question contienne un .gemspec pour la gem, ou que vous spécifiiez une version explicite que bundler devrait utiliser."

71
aceofspades

Essayez de décompresser la gemme puis d’utiliser le chemin dans votre Gemfile.

c'est à dire.

gem unpack my-gem-file.gem /my-Rails-app/vendor/gems/

puis ajoutez une ligne comme celle-ci à votre Gemfile

gem 'my-gem', '0.0.1', :path => 'vendor/gems/my-gem'

Évidemment, les chemins et les numéros de version varieront. Vous devrez peut-être également créer le répertoire vendor/gems dans la racine de votre application s'il n'existe pas déjà.

10
semanticart

Copiez la gem dans le répertoire vendor/cache dans le dossier racine de votre application.

bundle install --local

Cela va installer le joyau local.

5
Indika K

Etant donné que cette gemme sera locale pour toute machine sur laquelle vous exécuterez votre application, spécifiez simplement la gem dans Gemfile, puis installez-la manuellement. Lorsque vous exécutez "bundle install", celui-ci verra qu'il est déjà installé et passera à autre chose.

Cela a fonctionné pour moi lors de l'installation d'une version de Ruby-debug-base19 qui n'était pas encore disponible sur rubygems.org.

Une autre solution consisterait à configurer votre propre serveur bijou accessible à tous vos serveurs d'applications. Voir http://guides.rubygems.org/run-your-own-gem-server/

Je ne l'ai jamais fait moi-même mais ça a l'air très simple. Assurez-vous simplement de ne violer aucune des conditions de service de Chilkat si votre serveur gem doit se trouver sur Internet.

0
Kelvin

Commencez par décompresser la gemme en utilisant la solution par semanticart. Ensuite, ajoutez une gemspec dans la gemme décompressée. Bundler sera capable de fonctionner correctement.

Gem::Specification.new do |s|
  s.name         = "chilkat"
  s.version      = "9.4.1"
  s.platform     = Gem::Platform::Ruby
  s.required_rubygems_version = ">= 1.3.6"
  s.files        = Dir.glob("lib/**/*")
  s.require_path = "lib"
  s.summary      = "Make do with a self written gemspec"
end
0
liangzan