anchor.diff:                  {ok, Solution, []} ->
                       Solution;
                   {ok, Solution, Discarded} ->
  -                    [warn_skip_pkg(Pkg, State) || Pkg <- Discarded],
  +                    [warn_skip_pkg(Pkg, State) || Pkg <- Discarded, not(pkg_locked(Pkg, Locks))],
                       Solution
               end,
  -            update_pkg_deps(Profile, S, Packages, Upgrade, Seen, State)
  -    end.
  -
  -update_pkg_deps(Profile, Pkgs, Packages, Upgrade, Seen, State) ->
  +            update_pkg_deps(Profile, S, Packages, Upgrade, Seen, State, Locks)
  +    end.
  +
  +pkg_locked({Name, _}, Locks) ->
  +    false =/= lists:keyfind(Name, 1, Locks).
  +
  +update_pkg_deps(Profile, Pkgs, Packages, Upgrade, Seen, State, _Locks) ->
       %% Create app_info record for each pkg dep
       DepsDir = profile_dep_dir(State, Profile),
       {Solved, _, State1}
  
positive.code:                                             ,{Packages, Graph}),
  
                  update_pkg_deps(Profile, Packages, PkgDeps1
                                 ,Graph, Upgrade, Seen, State2)
          end,
  
      AllDeps = lists:ukeymerge(2
  
negative.code: cull_compile(TopSortedDeps, ProjectApps) ->
      lists:dropwhile(fun not_needs_compile/1, TopSortedDeps -- ProjectApps).
  
  update_pkg_deps(Profile, Packages, PkgDeps, Graph, Upgrade, Seen, State, Locks) ->
      case PkgDeps of
          [] -> %% No pkg deps
              {[], State};
  