Merge pull request #3106 from schellap/fx-version

Add --fx-version option to the muxer
This commit is contained in:
Senthil 2016-05-20 20:43:45 -07:00
commit d61e982011
3 changed files with 36 additions and 26 deletions

View file

@ -302,9 +302,7 @@ namespace Microsoft.DotNet.Cli.Build
c.Error($"Could not determine rid graph generation runtime for platform {RuntimeEnvironment.OperatingSystemPlatform}");
}
File.Copy(
Path.Combine(Dirs.CorehostLocked, DotnetHostBaseName),
Path.Combine(SharedFrameworkNameAndVersionRoot, DotnetHostBaseName), true);
// TODO: Issue #2408: Remove corehost and hostfxr from the Shared FX.
File.Copy(
Path.Combine(Dirs.CorehostLocked, DotnetHostBaseName),
Path.Combine(SharedFrameworkNameAndVersionRoot, $"corehost{Constants.ExeSuffix}"), true);
@ -485,4 +483,4 @@ namespace Microsoft.DotNet.Cli.Build
File.Delete(Path.Combine(path, $"{name}.pdb"));
}
}
}
}

View file

@ -26,7 +26,7 @@ void handle_missing_framework_error(const pal::string_t& fx_name, const pal::str
pal::string_t fx_ver_dirs = get_directory(fx_dir);
// Display the error message about missing FX.
trace::error(_X("The targeted framework { '%s': '%s' } was not found."), fx_name.c_str(), fx_version.c_str());
trace::error(_X("The specified framework '%s', version '%s' was not found."), fx_name.c_str(), fx_version.c_str());
trace::error(_X(" - Check application dependencies and target a framework version installed at:"));
trace::error(_X(" %s"), fx_ver_dirs.c_str());
@ -243,6 +243,7 @@ bool fx_muxer_t::resolve_hostpolicy_dir(host_mode_t mode,
const pal::string_t& fx_dir,
const pal::string_t& app_candidate,
const pal::string_t& specified_deps_file,
const pal::string_t& specified_fx_version,
const std::vector<pal::string_t>& probe_realpaths,
const runtime_config_t& config,
pal::string_t* impl_dir)
@ -269,7 +270,8 @@ bool fx_muxer_t::resolve_hostpolicy_dir(host_mode_t mode,
{
if (!pal::directory_exists(fx_dir))
{
handle_missing_framework_error(config.get_fx_name(), config.get_fx_version(), fx_dir);
pal::string_t fx_version = specified_fx_version.empty() ? config.get_fx_version() : specified_fx_version;
handle_missing_framework_error(config.get_fx_name(), fx_version, fx_dir);
return false;
}
@ -310,7 +312,7 @@ bool fx_muxer_t::resolve_hostpolicy_dir(host_mode_t mode,
return false;
}
pal::string_t fx_muxer_t::resolve_fx_dir(host_mode_t mode, const pal::string_t& own_dir, const runtime_config_t& config)
pal::string_t fx_muxer_t::resolve_fx_dir(host_mode_t mode, const pal::string_t& own_dir, const runtime_config_t& config, const pal::string_t& specified_fx_version)
{
// No FX resolution for standalone apps.
assert(mode != host_mode_t::standalone);
@ -322,15 +324,14 @@ pal::string_t fx_muxer_t::resolve_fx_dir(host_mode_t mode, const pal::string_t&
}
assert(mode == host_mode_t::muxer);
trace::verbose(_X("--- Resolving FX directory from muxer dir [%s]"), own_dir.c_str());
trace::verbose(_X("--- Resolving FX directory from muxer dir '%s', specified '%s'"), own_dir.c_str(), specified_fx_version.c_str());
const auto fx_name = config.get_fx_name();
const auto fx_ver = config.get_fx_version();
const auto patch_roll_fwd = config.get_patch_roll_fwd();
const auto fx_ver = specified_fx_version.empty() ? config.get_fx_version() : specified_fx_version;
fx_ver_t specified(-1, -1, -1);
if (!fx_ver_t::parse(fx_ver, &specified, false))
{
trace::error(_X("The specified runtimeconfig.json version [%s] could not be parsed"), fx_ver.c_str());
trace::error(_X("The specified framework version '%s' could not be parsed"), fx_ver.c_str());
return pal::string_t();
}
@ -339,22 +340,25 @@ pal::string_t fx_muxer_t::resolve_fx_dir(host_mode_t mode, const pal::string_t&
append_path(&fx_dir, fx_name.c_str());
bool do_roll_forward = false;
if (!specified.is_prerelease())
if (specified_fx_version.empty())
{
// If production and no roll forward use given version.
do_roll_forward = patch_roll_fwd;
}
else
{
// Prerelease, but roll forward only if version doesn't exist.
pal::string_t ver_dir = fx_dir;
append_path(&ver_dir, fx_ver.c_str());
do_roll_forward = !pal::directory_exists(ver_dir);
if (!specified.is_prerelease())
{
// If production and no roll forward use given version.
do_roll_forward = config.get_patch_roll_fwd();
}
else
{
// Prerelease, but roll forward only if version doesn't exist.
pal::string_t ver_dir = fx_dir;
append_path(&ver_dir, fx_ver.c_str());
do_roll_forward = !pal::directory_exists(ver_dir);
}
}
if (!do_roll_forward)
{
trace::verbose(_X("Did not roll forward because patch_roll_fwd=%d, chose [%s]"), patch_roll_fwd, fx_ver.c_str());
trace::verbose(_X("Did not roll forward because specified version='%s', patch_roll_fwd=%d, chose [%s]"), specified_fx_version.c_str(), config.get_patch_roll_fwd(), fx_ver.c_str());
append_path(&fx_dir, fx_ver.c_str());
}
else
@ -571,6 +575,7 @@ int muxer_usage()
trace::println(_X(" --version Display .NET Core Shared Framework Host version."));
trace::println();
trace::println(_X("Options:"));
trace::println(_X(" --fx-version <version> Version of the installed Shared Framework to use to run the application."));
trace::println(_X(" --additionalprobingpath <path> Path containing probing policy and assemblies to probe for."));
trace::println();
trace::println(_X("Path to Application:"));
@ -607,6 +612,10 @@ int fx_muxer_t::parse_args_and_execute(
known_opts.push_back(_X("--depsfile"));
known_opts.push_back(_X("--runtimeconfig"));
}
if (mode == host_mode_t::muxer)
{
known_opts.push_back(_X("--fx-version"));
}
// Parse the known arguments if any.
int num_parsed = 0;
@ -682,10 +691,12 @@ int fx_muxer_t::read_config_and_execute(
const std::unordered_map<pal::string_t, std::vector<pal::string_t>>& opts,
int new_argc, const pal::char_t** new_argv, host_mode_t mode)
{
pal::string_t opts_fx_version = _X("--fx-version");
pal::string_t opts_deps_file = _X("--depsfile");
pal::string_t opts_probe_path = _X("--additionalprobingpath");
pal::string_t opts_runtime_config = _X("--runtimeconfig");
pal::string_t fx_version = get_last_known_arg(opts, opts_fx_version, _X(""));
pal::string_t deps_file = get_last_known_arg(opts, opts_deps_file, _X(""));
pal::string_t runtime_config = get_last_known_arg(opts, opts_runtime_config, _X(""));
std::vector<pal::string_t> spec_probe_paths = opts.count(opts_probe_path) ? opts.find(opts_probe_path)->second : std::vector<pal::string_t>();
@ -733,13 +744,13 @@ int fx_muxer_t::read_config_and_execute(
}
bool is_portable = config.get_portable();
pal::string_t fx_dir = is_portable ? resolve_fx_dir(mode, own_dir, config) : _X("");
pal::string_t fx_dir = is_portable ? resolve_fx_dir(mode, own_dir, config, fx_version) : _X("");
trace::verbose(_X("Executing as a %s app as per config file [%s]"),
(is_portable ? _X("portable") : _X("standalone")), config_file.c_str());
pal::string_t impl_dir;
if (!resolve_hostpolicy_dir(mode, own_dir, fx_dir, app_candidate, deps_file, probe_realpaths, config, &impl_dir))
if (!resolve_hostpolicy_dir(mode, own_dir, fx_dir, app_candidate, deps_file, fx_version, probe_realpaths, config, &impl_dir))
{
return CoreHostLibMissingFailure;
}

View file

@ -28,11 +28,12 @@ private:
const pal::string_t& own_dir,
const pal::string_t& fx_dir,
const pal::string_t& app_or_deps_dir,
const pal::string_t& specified_deps,
const pal::string_t& specified_deps_file,
const pal::string_t& specified_fx_version,
const std::vector<pal::string_t>& probe_realpaths,
const runtime_config_t& config,
pal::string_t* impl_dir);
static pal::string_t resolve_fx_dir(host_mode_t mode, const pal::string_t& own_dir, const runtime_config_t& config);
static pal::string_t resolve_fx_dir(host_mode_t mode, const pal::string_t& own_dir, const runtime_config_t& config, const pal::string_t& specified_fx_version);
static pal::string_t resolve_cli_version(const pal::string_t& global);
static bool resolve_sdk_dotnet_path(const pal::string_t& own_dir, pal::string_t* cli_sdk);
};