bra*_*ing 17 c# nuget visual-studio-2017
我正在合并两个解决方案,现在有以下情况
这是一个大型项目,整合单个包需要足够的时间.巩固26,我会整天待在这里.有没有办法批量合并所以我可以去吃午饭,当我回来时它会完成?
关于评论,我将在此处发布我的解决方案。它是一个更大工具的一部分,因此我将在这里发布密钥类,将其连接在一起应该非常简单。已安装的软件包(您可能使用较新的版本):
"NuGet.Core": "2.12.0-rtm-815",
"NuGet.Packaging": "3.5.0-beta2-1484",
"NuGet.ProjectManagement": "3.5.0-beta2-1484",
Run Code Online (Sandbox Code Playgroud)
资源:
public class NugetSource
{
public string Name { get; set; }
public string Value { get; set; }
}
public class MyAppVersion
{
public double Id { get; set; }
public ObservableCollection<Dependency> Dependencies { get; set; }
public MyAppVersion()
{
Dependencies = new ObservableCollection<Dependency>();
}
}
public class Dependency : ReactiveObject
{
public Dependency()
{
AvailableVersions = new List<SemanticVersion>();
}
private SemanticVersion _version;
private string _name;
private List<SemanticVersion> _availableVersions;
[JsonProperty]
public string Name
{
get { return _name; }
set
{
_name = value;
this.RaiseAndSetIfChanged(ref _name, value);
}
}
[JsonProperty]
public SemanticVersion Version
{
get { return _version; }
set { this.RaiseAndSetIfChanged(ref _version, value); }
}
[JsonIgnore]
public List<SemanticVersion> AvailableVersions
{
get { return _availableVersions; }
set { this.RaiseAndSetIfChanged(ref _availableVersions, value); }
}
public override string ToString()
{
return $"Name: {Name}, Version: {Version}";
}
}
public class NugetUpdater : INugetUpdater
{
private readonly List<IPackageRepository> _supportedRepositories;
public NugetUpdater()
{
_supportedRepositories =
GetSources().Select(x => PackageRepositoryFactory.Default.CreateRepository(x.Value)).ToList();
}
public NugetSource[] GetSources()
{
var sources = new[]
{
new NugetSource() {Name = nameof(AppPaths.Dev), Value = AppPaths.Dev},
new NugetSource() {Name = nameof(AppPaths.Uat), Value = AppPaths.Uat},
new NugetSource() {Name = nameof(AppPaths.ThirdParty), Value = AppPaths.ThirdParty},
};
return sources;
}
public List<SemanticVersion> GetVersions(IEnumerable<string> feedUrls, string packageId)
{
var versions = new List<SemanticVersion>();
var repos = GetRepositories(feedUrls);
foreach (var currentRepo in repos)
{
var packages = currentRepo.FindPackagesById(packageId).ToList();
versions.AddRange(packages.Select(x => x.Version));
}
return versions;
}
public SemanticVersion GetLatestVersion(IEnumerable<string> feedUrls, string packageId)
{
var versions = GetVersions(feedUrls, packageId);
return versions.Any() ? versions.Max() : null;
}
public SemanticVersion GetLatestVersion(string feedUrl, string packageId)
{
return GetLatestVersion(new[] {feedUrl}, packageId);
}
public List<SemanticVersion> GetVersions(string feedUrl, string packageId)
{
return GetVersions(new[] {feedUrl}, packageId);
}
public List<Dependency> GetSolutionDependencies(string baseDir)
{
return Directory.EnumerateFiles(baseDir, "project.json", SearchOption.AllDirectories)
.Select(File.ReadAllText)
.Select(JObject.Parse)
.Select(GetDependencies)
.SelectMany(x => x)
.DistinctBy(x => x.Name)
.ToList();
}
private List<IPackageRepository> GetRepositories(IEnumerable<string> feedUrls)
{
return _supportedRepositories.Where(x => feedUrls.Contains(x.Source)).ToList();
}
public void Update(string baseDir, MyAppVersion version)
{
IEnumerable<string> jsonFiles =
Directory.EnumerateFiles(baseDir, "project.json", SearchOption.AllDirectories).ToList();
foreach (var projectJsonPath in jsonFiles)
{
var content = File.ReadAllText(projectJsonPath);
JObject json = JObject.Parse(content);
var projectDependencies = GetDependencies(json);
if (!projectDependencies.Any())
continue;
var projectDepNames = projectDependencies.Select(x => x.Name).ToList();
var toUpdateDependencies = version.Dependencies.Where(x => projectDepNames.Contains(x.Name)).ToList();
if (toUpdateDependencies.Count != projectDependencies.Count)
throw new Exception("Dependencies count is not equal. Something went wrong");
var dependenciesPairs = toUpdateDependencies.OrderBy(x => x.Name)
.Zip(projectDependencies.OrderBy(x => x.Name), (x, y) => new {ToUpdate = x, Project = y}).ToList();
bool anyChanged = false;
foreach (var dependencyPair in dependenciesPairs)
{
if (dependencyPair.Project.Version != dependencyPair.ToUpdate.Version)
{
anyChanged = true;
dependencyPair.Project.Version = dependencyPair.ToUpdate.Version;
}
}
if (anyChanged)
{
JObject obj = new JObject(projectDependencies.Select(x => new JProperty(x.Name, x.Version.ToNormalizedString())));
json["dependencies"] = obj;
File.WriteAllText(projectJsonPath, json.ToString(Formatting.Indented));
}
}
}
private static List<Dependency> GetDependencies(JObject json)
{
JObject dependenciesObject = (JObject) json["dependencies"];
var dependencies = dependenciesObject.Properties().Select(x => new Dependency
{
Name = x.Name,
Version = SemanticVersion.Parse(x.Value.Value<string>())
}).ToList();
return dependencies;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,应用程序用于NugetUpdater GetSolutionDependencies向用户显示解决方案中的所有依赖关系。
然后,GetVersions方法用于获取所选软件包的可用版本。用户可以选择自己感兴趣的版本。完成后,单击更新,Update函数将使用用户选择的版本来替换解决方案中所有project.jsons中的所有依赖项。
用户可以为所有软件包选择最新版本,而不是一个一个地选择版本,通过组合使用非常简单
GetSolutionDependencies+ GetLatestVersion每个包+ Update。
基本上,结果是使用最新版本软件包更新的project.json列表。
您要做的就是nuget restore使用VS 运行或构建解决方案,这将自动调用restore。
| 归档时间: |
|
| 查看次数: |
3255 次 |
| 最近记录: |