dotnet-installer/src/Microsoft.DotNet.ProjectModel/GlobalSettings.cs

84 lines
2.7 KiB
C#

// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.IO;
using Microsoft.Extensions.JsonParser.Sources;
namespace Microsoft.DotNet.ProjectModel
{
public class GlobalSettings
{
public const string FileName = "global.json";
public IList<string> ProjectSearchPaths { get; private set; }
public string PackagesPath { get; private set; }
public string FilePath { get; private set; }
public string DirectoryPath
{
get
{
return Path.GetFullPath(Path.GetDirectoryName(FilePath));
}
}
public static bool TryGetGlobalSettings(string path, out GlobalSettings globalSettings)
{
globalSettings = null;
string globalJsonPath = null;
if (Path.GetFileName(path) == FileName)
{
globalJsonPath = path;
path = Path.GetDirectoryName(path);
}
else if (!HasGlobalFile(path))
{
return false;
}
else
{
globalJsonPath = Path.Combine(path, FileName);
}
globalSettings = new GlobalSettings();
try
{
using (var fs = File.OpenRead(globalJsonPath))
{
var reader = new StreamReader(fs);
var jobject = JsonDeserializer.Deserialize(reader) as JsonObject;
if (jobject == null)
{
throw new InvalidOperationException("The JSON file can't be deserialized to a JSON object.");
}
var projectSearchPaths = jobject.ValueAsStringArray("projects") ??
jobject.ValueAsStringArray("sources") ??
new string[] { };
globalSettings.ProjectSearchPaths = new List<string>(projectSearchPaths);
globalSettings.PackagesPath = jobject.ValueAsString("packages");
globalSettings.FilePath = globalJsonPath;
}
}
catch (Exception ex)
{
throw FileFormatException.Create(ex, globalJsonPath);
}
return true;
}
public static bool HasGlobalFile(string path)
{
string projectPath = Path.Combine(path, FileName);
return File.Exists(projectPath);
}
}
}