A lockfile-like table records the exact version selected for each dependency.

lockfile A lockfile records resolved versions so future installs can choose the same versions.

Lockfile Selection

module
lockfile_selection.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

my $module = "JSON";
my %locked = (
    JSON => "4.10",
    DBI => "1.643",
);
my $version = $locked{$module} // "none";
my $status = $version eq "none" ? "unlocked" : "locked";

print "module=$module\n";
print "version=$version\n";
print "status=$status\n";
use strict;
use warnings;

my $module = "DBI";
my %locked = (
    JSON => "4.10",
    DBI => "1.643",
);
my $version = $locked{$module} // "none";
my $status = $version eq "none" ? "unlocked" : "locked";

print "module=$module\n";
print "version=$version\n";
print "status=$status\n";
use strict;
use warnings;

my $module = "Missing::Tool";
my %locked = (
    JSON => "4.10",
    DBI => "1.643",
);
my $version = $locked{$module} // "none";
my $status = $version eq "none" ? "unlocked" : "locked";

print "module=$module\n";
print "version=$version\n";
print "status=$status\n";
  1. $module ← JSON, %locked ← 2, $version ← 4.10, $status ← locked

    4my $module→ JSON = "JSON"; #@module="DBI", "Missing::Tool"5my %locked→ 2 = (6    JSON => "4.10",7    DBI => "1.643",8);9my $version→ 4.10 = $locked{$module}4.10 // "none";10my $status→ locked = $version4.10 eq "none" ? "unlocked" : "locked";1112print "module=$moduleJSON\n";13print "version=$version4.10\n";14print "status=$statuslocked\n";
    outputmodule=JSON
    version=4.10
    status=locked
  1. $module ← DBI, %locked ← 2, $version ← 1.643, $status ← locked

    4my $module→ DBI = "DBI";5my %locked→ 2 = (6    JSON => "4.10",7    DBI => "1.643",8);9my $version→ 1.643 = $locked{$module}1.643 // "none";10my $status→ locked = $version1.643 eq "none" ? "unlocked" : "locked";1112print "module=$moduleDBI\n";13print "version=$version1.643\n";14print "status=$statuslocked\n";
    outputmodule=DBI
    version=1.643
    status=locked
  1. $module ← Missing::Tool, %locked ← 2, $version ← none, $status ← unlocked

    4my $module→ Missing::Tool = "Missing::Tool";5my %locked→ 2 = (6    JSON => "4.10",7    DBI => "1.643",8);9my $version→ none = $locked{$module}(empty) // "none";10my $status→ unlocked = $versionnone eq "none" ? "unlocked" : "locked";1112print "module=$moduleMissing::Tool\n";13print "version=$versionnone\n";14print "status=$statusunlocked\n";
    outputmodule=Missing::Tool
    version=none
    status=unlocked