Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Merge pull request #2039 from ramarag/probe_paths
Browse files Browse the repository at this point in the history
Probe paths
  • Loading branch information
ramarag authored Apr 15, 2017
2 parents 6c9912e + ffb7490 commit be235df
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 45 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,74 +11,95 @@ namespace Microsoft.Extensions.DependencyModel.Resolution
public class PackageCompilationAssemblyResolver: ICompilationAssemblyResolver
{
private readonly IFileSystem _fileSystem;
private readonly string _nugetPackageDirectory;
private readonly string[] _nugetPackageDirectories;

public PackageCompilationAssemblyResolver()
: this(EnvironmentWrapper.Default, FileSystemWrapper.Default)
{
}

public PackageCompilationAssemblyResolver(string nugetPackageDirectory)
: this(FileSystemWrapper.Default, nugetPackageDirectory)
: this(FileSystemWrapper.Default, new string[] { nugetPackageDirectory })
{
}

internal PackageCompilationAssemblyResolver(IEnvironment environment,
IFileSystem fileSystem)
: this(fileSystem, GetDefaultPackageDirectory(environment))
: this(fileSystem, GetDefaultProbeDirectories(environment))
{
}

internal PackageCompilationAssemblyResolver(IFileSystem fileSystem, string nugetPackageDirectory)
internal PackageCompilationAssemblyResolver(IFileSystem fileSystem, string[] nugetPackageDirectories)
{
_fileSystem = fileSystem;
_nugetPackageDirectory = nugetPackageDirectory;
_nugetPackageDirectories = nugetPackageDirectories;
}

private static string GetDefaultPackageDirectory(IEnvironment environment) =>
GetDefaultPackageDirectory(RuntimeEnvironment.OperatingSystemPlatform, environment);
private static string[] GetDefaultProbeDirectories(IEnvironment environment) =>
GetDefaultProbeDirectories(RuntimeEnvironment.OperatingSystemPlatform, environment);

internal static string GetDefaultPackageDirectory(Platform osPlatform, IEnvironment environment)
internal static string[] GetDefaultProbeDirectories(Platform osPlatform, IEnvironment environment)
{
var packageDirectory = environment.GetEnvironmentVariable("NUGET_PACKAGES");
#if !NETSTANDARD1_3
#if NETSTANDARD1_6
var probeDirectories = AppContext.GetData("PROBING_DIRECTORIES");
#else
var probeDirectories = AppDomain.CurrentDomain.GetData("PROBING_DIRECTORIES");
#endif

if (!string.IsNullOrEmpty(packageDirectory))
{
return packageDirectory;
}
var listOfDirectories = probeDirectories as string;

if (!string.IsNullOrEmpty(listOfDirectories))
{
return listOfDirectories.Split(new char [] { Path.PathSeparator }, StringSplitOptions.RemoveEmptyEntries );
}
#endif

var packageDirectory = environment.GetEnvironmentVariable("NUGET_PACKAGES");

if (!string.IsNullOrEmpty(packageDirectory))
{
return new string[] { packageDirectory };
}

string basePath;
if (osPlatform == Platform.Windows)
{
basePath = environment.GetEnvironmentVariable("USERPROFILE");
}
else
{
basePath = environment.GetEnvironmentVariable("HOME");
}

if (string.IsNullOrEmpty(basePath))
{
return new string[] { string.Empty };
}

return new string[] { Path.Combine(basePath, ".nuget", "packages") };

string basePath;
if (osPlatform == Platform.Windows)
{
basePath = environment.GetEnvironmentVariable("USERPROFILE");
}
else
{
basePath = environment.GetEnvironmentVariable("HOME");
}
if (string.IsNullOrEmpty(basePath))
{
return null;
}
return Path.Combine(basePath, ".nuget", "packages");
}

public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
{
if (string.IsNullOrEmpty(_nugetPackageDirectory) ||
if (_nugetPackageDirectories == null || _nugetPackageDirectories.Length == 0 ||
!string.Equals(library.Type, "package", StringComparison.OrdinalIgnoreCase))
{
return false;
}

string packagePath;

if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, _nugetPackageDirectory, out packagePath))
foreach (var directory in _nugetPackageDirectories)
{
assemblies.AddRange(ResolverUtils.ResolveFromPackagePath(_fileSystem, library, packagePath));
return true;
string packagePath;

if (ResolverUtils.TryResolvePackagePath(_fileSystem, library, directory, out packagePath))
{
assemblies.AddRange(ResolverUtils.ResolveFromPackagePath(_fileSystem, library, packagePath));
return true;
}
}
return false;
}
}
}
}
12 changes: 12 additions & 0 deletions src/corehost/cli/deps_resolver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,18 @@ void deps_resolver_t::setup_shared_store_probes(
}
}

pal::string_t deps_resolver_t::get_probe_directories()
{
pal::string_t directories;
for (const auto& pc : m_probes)
{
directories.append(pc.probe_dir);
directories.push_back(PATH_SEPARATOR);
}

return directories;
}

void deps_resolver_t::setup_probe_config(
const hostpolicy_init_t& init,
const arguments_t& args)
Expand Down
2 changes: 2 additions & 0 deletions src/corehost/cli/deps_resolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class deps_resolver_t
const hostpolicy_init_t& init,
const arguments_t& args);

pal::string_t get_probe_directories();

void setup_probe_config(
const hostpolicy_init_t& init,
const arguments_t& args);
Expand Down
11 changes: 8 additions & 3 deletions src/corehost/cli/hostpolicy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,12 @@ int run(const arguments_t& args)
// Workaround: mscorlib does not resolve symlinks for AppContext.BaseDirectory dotnet/coreclr/issues/2128
"APP_CONTEXT_BASE_DIRECTORY",
"APP_CONTEXT_DEPS_FILES",
"FX_DEPS_FILE"
"FX_DEPS_FILE",
"PROBING_DIRECTORIES"
};

// Note: these variables' lifetime should be longer than coreclr_initialize.
std::vector<char> tpa_paths_cstr, app_base_cstr, native_dirs_cstr, resources_dirs_cstr, fx_deps, deps, clrjit_path_cstr;
std::vector<char> tpa_paths_cstr, app_base_cstr, native_dirs_cstr, resources_dirs_cstr, fx_deps, deps, clrjit_path_cstr, probe_directories;
pal::pal_clrstring(probe_paths.tpa, &tpa_paths_cstr);
pal::pal_clrstring(args.app_dir, &app_base_cstr);
pal::pal_clrstring(probe_paths.native, &native_dirs_cstr);
Expand All @@ -86,6 +87,8 @@ int run(const arguments_t& args)
pal::pal_clrstring(resolver.get_fx_deps_file(), &fx_deps);
pal::pal_clrstring(resolver.get_deps_file() + _X(";") + resolver.get_fx_deps_file(), &deps);

pal::pal_clrstring(resolver.get_probe_directories(), &probe_directories);

std::vector<const char*> property_values = {
// TRUSTED_PLATFORM_ASSEMBLIES
tpa_paths_cstr.data(),
Expand All @@ -100,7 +103,9 @@ int run(const arguments_t& args)
// APP_CONTEXT_DEPS_FILES,
deps.data(),
// FX_DEPS_FILE
fx_deps.data()
fx_deps.data(),
//PROBING_DIRECTORIES
probe_directories.data()
};

if (!clrjit_path.empty())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ public void ShouldUseEnvironmentVariableToGetDefaultLocation()
.AddVariable("NUGET_PACKAGES", PackagesPath)
.Build();

var result = PackageCompilationAssemblyResolver.GetDefaultPackageDirectory(Platform.Unknown, environment);
result.Should().Be(PackagesPath);
var result = PackageCompilationAssemblyResolver.GetDefaultProbeDirectories(Platform.Unknown, environment);
result.Should().Contain(PackagesPath);
}


Expand All @@ -36,8 +36,8 @@ public void ShouldUseNugetUnderUserProfileOnWindows()
.AddVariable("USERPROFILE", "User Profile")
.Build();

var result = PackageCompilationAssemblyResolver.GetDefaultPackageDirectory(Platform.Windows, environment);
result.Should().Be(Path.Combine("User Profile", ".nuget", "packages"));
var result = PackageCompilationAssemblyResolver.GetDefaultProbeDirectories(Platform.Windows, environment);
result.Should().Contain(Path.Combine("User Profile", ".nuget", "packages"));
}

[Fact]
Expand All @@ -47,8 +47,8 @@ public void ShouldUseNugetUnderHomeOnNonWindows()
.AddVariable("HOME", "User Home")
.Build();

var result = PackageCompilationAssemblyResolver.GetDefaultPackageDirectory(Platform.Linux, environment);
result.Should().Be(Path.Combine("User Home", ".nuget", "packages"));
var result = PackageCompilationAssemblyResolver.GetDefaultProbeDirectories(Platform.Linux, environment);
result.Should().Contain(Path.Combine("User Home", ".nuget", "packages"));
}

[Fact]
Expand All @@ -60,7 +60,7 @@ public void ResolvesAllAssemblies()
.Build();
var library = F.Create(assemblies: F.TwoAssemblies);

var resolver = new PackageCompilationAssemblyResolver(fileSystem, PackagesPath);
var resolver = new PackageCompilationAssemblyResolver(fileSystem, new string[] { PackagesPath });
var assemblies = new List<string>();

var result = resolver.TryResolveAssemblyPaths(library, assemblies);
Expand All @@ -80,7 +80,7 @@ public void FailsWhenOneOfAssembliesNotFound()
.Build();
var library = F.Create(assemblies: F.TwoAssemblies);

var resolver = new PackageCompilationAssemblyResolver(fileSystem, PackagesPath);
var resolver = new PackageCompilationAssemblyResolver(fileSystem, new string[] { PackagesPath });
var assemblies = new List<string>();

var exception = Assert.Throws<InvalidOperationException>(() => resolver.TryResolveAssemblyPaths(library, assemblies));
Expand Down

0 comments on commit be235df

Please sign in to comment.