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

Probe paths #2039

Merged
merged 2 commits into from
Apr 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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");

This comment was marked as spam.

#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)

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

{
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);

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

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