in pkg/ruby/ruby.go [37:111]
func DetectVersion(ctx *gcp.Context) (string, error) {
versionFromEnv := os.Getenv(env.RuntimeVersion)
// The two lock files have the same format for Ruby version
lockFiles := []string{"Gemfile.lock", "gems.locked"}
// If environment is GAE or GCF, skip lock file validation.
// App Engine specific validation is done in a different buildpack.
if env.IsGAE() || env.IsGCF() {
if versionFromEnv != "" {
ctx.Logf(
"Using runtime version from environment variable %s: %s", env.RuntimeVersion, versionFromEnv)
return versionFromEnv, nil
}
}
versionFromRubyVersion, err := getVersionFromRubyVersion(ctx)
if err != nil {
return "", err
}
if versionFromEnv != "" && versionFromRubyVersion != "" && versionFromRubyVersion != versionFromEnv {
return "", gcp.UserErrorf(
"There is a conflict between Ruby versions specified in .ruby-version file and the %s environment variable. "+
"Please resolve the conflict by choosing only one way to specify the ruby version.",
env.RuntimeVersion)
}
for _, lockFileName := range lockFiles {
path := filepath.Join(ctx.ApplicationRoot(), lockFileName)
pathExists, err := ctx.FileExists(path)
if err != nil {
return "", err
}
if pathExists {
lockedVersion, err := ParseRubyVersion(path)
if err != nil {
return "", gcp.UserErrorf("Error %q in: %s", err, lockFileName)
}
// Lockfile doesn't contain a ruby version, so we can move on
if lockedVersion == "" {
break
}
// Bundler doesn't allow us to override a version of ruby if it's locked in the lock file
// The env will still be useful if a project doesn't lock ruby version or doesn't use bundler
if versionFromEnv != "" && lockedVersion != versionFromEnv {
return "", gcp.UserErrorf(
"Ruby version %q in %s can't be overriden to %q using %s environment variable",
lockedVersion, lockFileName, versionFromEnv, env.RuntimeVersion)
}
if versionFromRubyVersion != "" && lockedVersion != versionFromRubyVersion {
return "", gcp.UserErrorf(
"There is a conflict between the Ruby version %q in %s and %q in .ruby-version file."+
"Please resolve the conflict by choosing only one way to specify the ruby version.",
lockedVersion, lockFileName, versionFromRubyVersion)
}
return lockedVersion, err
}
}
if versionFromEnv != "" {
ctx.Logf(
"Using runtime version from environment variable %s: %s", env.RuntimeVersion, versionFromEnv)
return versionFromEnv, nil
}
if versionFromRubyVersion != "" {
ctx.Logf(
"Using runtime version from .ruby-version file: %s", versionFromRubyVersion)
return versionFromRubyVersion, nil
}
return defaultVersion, nil
}