Skip to content

Unexpected behaviour when auto-syncing Gemfiles #25

@Illianthe

Description

@Illianthe

While experimenting with this plugin I ran into a couple of cases that felt a bit unintuitive:

  • Suppose we had an already-existing barebones setup (i.e. Gemfile_next.lock is present) and then we added the following to the Gemfile:

    if ENV['DEPENDENCIES_NEXT']
      gem 'rspec'
    end

    Running bundle install alone won't update Gemfile_next.lock as Gemfile.lock never actually changes. Of course if several gems were added simultaneously and at least one was outside that conditional both files will get updated properly.

  • Running bundle install or bundle update with DEPENDENCIES_NEXT already set won't ever modify Gemfile.lock. There are a few cases where we might set that variable globally (e.g. through a .env file with Docker Compose, etc.) and updating Gemfile.lock would require something like:

    unset DEPENDENCIES_NEXT
    bundle install
    export DEPENDENCIES_NEXT=1

    Aside from the increase in cognitive load, I'm not sure if the intention was to be able to update each lockfile individually. If that's the case I don't think it's possible to update Gemfile.lock by itself as there's no way to skip the auto-sync process when the environment variable isn't set. One possible fix might be to compare the value of DEPENDENCIES_NEXT rather than checking for its presence.


I took a stab at addressing some of this in master...Illianthe:auto-sync but I figure it'd be worth bringing it up for discussion beforehand:

  • Added an env var to skip the auto-sync process (SKIP_BUNDLER_AUTOSYNC)
  • Dropped the nothing_changed? check so that Gemfile_next.lock will be updated even when Gemfile.lock hasn't changed (and vice-versa)
  • Modified the update! logic to preserve existing env vars, allowing calls like DEPENDENCIES_NEXT=1 bundle install to also update Gemfile.lock

This allows for the following combinations:

  • Assuming Gemfile.lock is the default (i.e. using DEPENDENCIES_NEXT)
    • SKIP_BUNDLER_AUTOSYNC=1 bundle install will update Gemfile.lock individually
    • SKIP_BUNDLER_AUTOSYNC=1 DEPENDENCIES_NEXT=1 bundle install will update Gemfile_next.lock individually
    • bundle install and DEPENDENCIES_NEXT=1 bundle install will update both Gemfile.lock and Gemfile_next.lock
  • Assuming Gemfile_next.lock is the default (i.e. using DEPENDENCIES_PREVIOUS)
    • SKIP_BUNDLER_AUTOSYNC=1 bundle install will update Gemfile_next.lock individually
    • SKIP_BUNDLER_AUTOSYNC=1 DEPENDENCIES_PREVIOUS=1 bundle install will update Gemfile.lock individually
    • bundle install and DEPENDENCIES_PREVIOUS=1 bundle install will update both Gemfile.lock and Gemfile_next.lock

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions