Skip to content

Commit

Permalink
#4 v1.0.7; 支持install参数-ctn, 安装时自动复制xml到nuget缓存同名包的文件夹中
Browse files Browse the repository at this point in the history
  • Loading branch information
stratosblue committed Jun 24, 2023
1 parent e6ded26 commit d1b6433
Show file tree
Hide file tree
Showing 18 changed files with 316 additions and 39 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

<!--Package Info-->
<PropertyGroup>
<VersionPrefix>1.0.6</VersionPrefix>
<VersionPrefix>1.0.7</VersionPrefix>

<Description>a tool for generate and install Localized IntelliSense files. 用于生成和安装本地化IntelliSense文件的工具。</Description>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public async Task<string> DownloadAsync(IntelliSenseItemDescriptor memberDescrip
{
var queryKey = memberDescriptor.GetMicrosoftDocsQueryKey();
var intelliSenseFile = memberDescriptor.IntelliSenseFileDescriptor;
var frameworkMoniker = intelliSenseFile.OwnerPackRef.OwnerMoniker.Moniker;
var cacheDriectory = Path.Combine(_cacheRoot, intelliSenseFile.OwnerPackRef.OwnerMoniker.OwnerVersion.OwnerPack.Name, frameworkMoniker, _locale);
var frameworkMoniker = intelliSenseFile.Moniker;
var cacheDriectory = Path.Combine(_cacheRoot, intelliSenseFile.Name, frameworkMoniker, _locale);
var cacheFilePath = Path.Combine(cacheDriectory, $"{queryKey}.html");

DirectoryUtil.CheckDirectory(cacheDriectory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Cuture.Http" Version="2.7.1" />
<PackageReference Include="HtmlAgilityPack" Version="1.11.46" />
<PackageReference Include="Cuture.Http" Version="2.7.2" />
<PackageReference Include="HtmlAgilityPack" Version="1.11.48" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="7.0.1" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace IntelliSenseLocalizer.Models;
using IntelliSenseLocalizer.Utils;

namespace IntelliSenseLocalizer.Models;

/// <summary>
/// 描述 C:\Program Files\dotnet\packs\*.App.Ref 例如 C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref
Expand Down Expand Up @@ -39,10 +41,7 @@ public static IEnumerable<ApplicationPackVersionDescriptor> EnumerateApplication
//loop for file like C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\*
foreach (var versionPath in Directory.EnumerateDirectories(path, "*", SearchOption.TopDirectoryOnly))
{
var versionString = Path.GetFileName(versionPath);
var i = versionString.IndexOf('-');
if (i >= 0) versionString = versionString[..i];
if (Version.TryParse(versionString, out var version))
if (VersionUtil.TryParse(Path.GetFileName(versionPath), out var version))
{
yield return new ApplicationPackVersionDescriptor(applicationPack, version, versionPath);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public static IEnumerable<IntelliSenseFileDescriptor> EnumerateIntelliSenseFiles
{
var intelliSenseName = Path.GetFileNameWithoutExtension(intelliSenseFilePath);
var intelliSenseFileName = Path.GetFileName(intelliSenseFilePath);
yield return new IntelliSenseFileDescriptor(applicationPackRef, intelliSenseName, intelliSenseFileName, intelliSenseFilePath);
yield return new IntelliSenseFileDescriptor(intelliSenseName, intelliSenseFileName, intelliSenseFilePath, applicationPackRef.OwnerMoniker.OwnerVersion.OwnerPack.Name, applicationPackRef.OwnerMoniker.Moniker, applicationPackRef.Culture);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
namespace IntelliSenseLocalizer.Models;
using System.Globalization;

public record class IntelliSenseFileDescriptor(ApplicationPackRefDescriptor OwnerPackRef, string Name, string FileName, string FilePath);
namespace IntelliSenseLocalizer.Models;

public record class IntelliSenseFileDescriptor(string Name, string FileName, string FilePath, string PackName, string Moniker, CultureInfo? Culture);
26 changes: 26 additions & 0 deletions src/IntelliSenseLocalizer.Core/Nuget/GlobalPackagesFinder.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
namespace IntelliSenseLocalizer.Nuget;

public static class GlobalPackagesFinder
{
public static readonly string Location;

static GlobalPackagesFinder()
{
//see https://learn.microsoft.com/zh-cn/nuget/consume-packages/managing-the-global-packages-and-cache-folders
Location = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".nuget", "packages");
}

public static IEnumerable<NugetGlobalPackageDescriptor> EnumeratePackages()
{
if (!Directory.Exists(Location))
{
yield break;
}
foreach (var packageFolder in Directory.EnumerateDirectories(Location, "*", SearchOption.TopDirectoryOnly))
{
var normalizedName = Path.GetFileName(packageFolder);

yield return new NugetGlobalPackageDescriptor(normalizedName, packageFolder);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
using IntelliSenseLocalizer.Utils;

namespace IntelliSenseLocalizer.Nuget;

public class NugetGlobalPackageDescriptor
{
public string NormalizedName { get; set; }

public string RootPath { get; set; }

/// <summary>
/// 应用程序包版本描述列表
/// </summary>
public IReadOnlyList<NugetGlobalPackageVersionDescriptor> Versions => _versions ??= new List<NugetGlobalPackageVersionDescriptor>(EnumerateNugetGlobalPackageVersions(this));

private IReadOnlyList<NugetGlobalPackageVersionDescriptor>? _versions;

public NugetGlobalPackageDescriptor(string normalizedName, string rootPath)
{
if (string.IsNullOrWhiteSpace(normalizedName))
{
throw new ArgumentException($"{nameof(normalizedName)}”不能为 null 或空白。", nameof(normalizedName));
}

if (string.IsNullOrWhiteSpace(rootPath))
{
throw new ArgumentException($"{nameof(rootPath)}”不能为 null 或空白。", nameof(rootPath));
}

NormalizedName = normalizedName;
RootPath = rootPath;
}

public override string ToString()
{
return $"{NormalizedName}";
}

public static IEnumerable<NugetGlobalPackageVersionDescriptor> EnumerateNugetGlobalPackageVersions(NugetGlobalPackageDescriptor nugetGlobalPackage)
{
var path = nugetGlobalPackage.RootPath;
if (!Directory.Exists(path))
{
yield break;
}

//loop for path like %userprofile%\.nuget\packages\*\*
foreach (var versionPath in Directory.EnumerateDirectories(path, "*", SearchOption.TopDirectoryOnly))
{
if (VersionUtil.TryParse(Path.GetFileName(versionPath), out var version))
{
yield return new NugetGlobalPackageVersionDescriptor(nugetGlobalPackage, version, versionPath);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
namespace IntelliSenseLocalizer.Nuget;

public class NugetGlobalPackageVersionDescriptor
{
public NugetGlobalPackageVersionDescriptor(NugetGlobalPackageDescriptor ownerPackage, Version version, string rootPath)
{
OwnerPackage = ownerPackage;
Version = version;
RootPath = rootPath;
}

public NugetGlobalPackageDescriptor OwnerPackage { get; }

public Version Version { get; }

public string RootPath { get; }

public override string ToString()
{
return $"{Version}";
}

public IReadOnlyList<NugetGlobalPackageVersionMonikerDescriptor> Monikers => _versions ??= new List<NugetGlobalPackageVersionMonikerDescriptor>(EnumerateNugetGlobalPackageVersionMonikers(this));

private IReadOnlyList<NugetGlobalPackageVersionMonikerDescriptor>? _versions;

public static IEnumerable<NugetGlobalPackageVersionMonikerDescriptor> EnumerateNugetGlobalPackageVersionMonikers(NugetGlobalPackageVersionDescriptor nugetGlobalPackageVersion)
{
var path = Path.Combine(nugetGlobalPackageVersion.RootPath, "lib");
if (!Directory.Exists(path))
{
yield break;
}

//loop for path like %userprofile%\.nuget\packages\xxx\1.0.0\lib\*
foreach (var monikerPath in Directory.EnumerateDirectories(path, "*", SearchOption.TopDirectoryOnly))
{
yield return new NugetGlobalPackageVersionMonikerDescriptor(nugetGlobalPackageVersion, Path.GetFileName(monikerPath), monikerPath);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
using IntelliSenseLocalizer.Models;

namespace IntelliSenseLocalizer.Nuget;

public class NugetGlobalPackageVersionMonikerDescriptor
{
/// <summary>
/// .net 名称
/// </summary>
public string Moniker { get; }

public NugetGlobalPackageVersionDescriptor OwnerVersion { get; }

/// <summary>
/// 根目录
/// </summary>
public string RootPath { get; }

public IReadOnlyList<IntelliSenseFileDescriptor> IntelliSenseFiles => _intelliSenseFiles ??= new List<IntelliSenseFileDescriptor>(EnumerateIntelliSenseFiles(this));

private IReadOnlyList<IntelliSenseFileDescriptor>? _intelliSenseFiles;

public NugetGlobalPackageVersionMonikerDescriptor(NugetGlobalPackageVersionDescriptor ownerVersion, string moniker, string rootPath)
{
if (string.IsNullOrWhiteSpace(moniker))
{
throw new ArgumentException($"{nameof(moniker)}”不能为 null 或空白。", nameof(moniker));
}

if (string.IsNullOrWhiteSpace(rootPath))
{
throw new ArgumentException($"{nameof(rootPath)}”不能为 null 或空白。", nameof(rootPath));
}

OwnerVersion = ownerVersion;
RootPath = rootPath;
Moniker = moniker;
}

public override string ToString()
{
return $"{Moniker}";
}

public static IEnumerable<IntelliSenseFileDescriptor> EnumerateIntelliSenseFiles(NugetGlobalPackageVersionMonikerDescriptor nugetGlobalPackageVersionMoniker)
{
var path = nugetGlobalPackageVersionMoniker.RootPath;
if (!Directory.Exists(path))
{
yield break;
}

foreach (var dllPath in Directory.EnumerateFiles(path, "*.dll", SearchOption.TopDirectoryOnly))
{
var xmlPath = Path.ChangeExtension(dllPath, ".xml");
if (File.Exists(xmlPath))
{
yield return new IntelliSenseFileDescriptor(Path.GetFileNameWithoutExtension(xmlPath), Path.GetFileName(xmlPath), xmlPath, nugetGlobalPackageVersionMoniker.OwnerVersion.OwnerPackage.NormalizedName, nugetGlobalPackageVersionMoniker.Moniker, null);
}
}
}
}
20 changes: 20 additions & 0 deletions src/IntelliSenseLocalizer.Core/Utils/VersionUtil.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System.Diagnostics.CodeAnalysis;

namespace IntelliSenseLocalizer.Utils;

internal static class VersionUtil
{
public static bool TryParse(string versionString, [NotNullWhen(true)] out Version? version)
{
var index = versionString.IndexOf('-');
if (index >= 0)
{
versionString = versionString[..index];
}
if (Version.TryParse(versionString, out version))
{
return true;
}
return false;
}
}
Loading

0 comments on commit d1b6433

Please sign in to comment.