protected override bool FixDocumentByStrategy(NugetFixStrategy nugetFixStrategy) { var packageReferences = CsProj.GetPackageReferences(Document).Where(x => x.Attribute(CsProj.IncludeAttribute).Value == nugetFixStrategy.NugetName); var nugetInfoReferences = CsProj.GetNugetInfoReferences(Document).Where(x => CsProj.GetNugetInfoFromNugetInfoReference(x).Name == nugetFixStrategy.NugetName); if (!packageReferences.Any() && !nugetInfoReferences.Any()) { return(false); } if (nugetFixStrategy.NugetVersion == NugetVersion.IgnoreFix) { Log = StringSplicer.SpliceWithNewLine(Log, $" - 根据策略,忽略 {nugetFixStrategy.NugetName} 存在的问题"); return(true); } if (packageReferences.Any()) { FixPackageReferences(packageReferences, nugetFixStrategy); DeleteNugetInfoReferences(nugetInfoReferences); } else { FixNugetInfoReferences(nugetInfoReferences, nugetFixStrategy); } return(true); }
private void FixNugetInfoReferences(IEnumerable <XElement> nugetInfoReferences, NugetFixStrategy nugetFixStrategy) { var nugetInfoReferenceList = nugetInfoReferences.ToList(); for (var i = 0; i < nugetInfoReferenceList.Count; i++) { if (i != 0) { nugetInfoReferenceList[i].Remove(); continue; } var firstNugetInfoReference = nugetInfoReferenceList[i]; if (nugetFixStrategy.NugetDllInfo == null) { ; } firstNugetInfoReference.SetAttributeValue(CsProj.IncludeAttribute, nugetFixStrategy.NugetDllInfo.DllFullName); Log = StringSplicer.SpliceWithNewLine(Log, $" - 将 {nugetFixStrategy.NugetName} 设定为 {nugetFixStrategy.NugetVersion}"); var hintPathElementList = firstNugetInfoReference.Elements() .Where(x => x.Name.LocalName == CsProj.HintPathElementName).ToList(); for (var j = 0; j < hintPathElementList.Count; j++) { if (j != 0) { hintPathElementList[i].Remove(); continue; } hintPathElementList[i].Value = MakeRelativePath(Path.GetDirectoryName(_csProjPath), nugetFixStrategy.NugetDllInfo.DllPath); } if (hintPathElementList.Count > 1) { Log = StringSplicer.SpliceWithNewLine(Log, $" - 删除了 {nugetFixStrategy.NugetName} 的 {hintPathElementList.Count - 1} 个子健冲突"); } } if (nugetInfoReferenceList.Count > 1) { Log = StringSplicer.SpliceWithNewLine(Log, $" - 删除了 {nugetFixStrategy.NugetName} 的 {nugetInfoReferenceList.Count - 1} 个冲突引用"); } }
/// <summary> /// 使用指定的策略进行修复 /// </summary> /// <param name="nugetFixStrategy">修复策略</param> /// <returns>策略是否有效执行</returns> protected override bool FixDocumentByStrategy(NugetFixStrategy nugetFixStrategy) { if (ReferenceEquals(nugetFixStrategy, null)) { throw new ArgumentNullException(nameof(nugetFixStrategy)); } var rootElement = Document.Root; var packageElementList = rootElement.Elements() .Where(x => x.Attribute(PackagesConfig.IdAttribute).Value == nugetFixStrategy.NugetName).ToList(); if (!packageElementList.Any()) { return(false); } if (nugetFixStrategy.NugetVersion == NugetVersion.IgnoreFix) { Log = StringSplicer.SpliceWithNewLine(Log, $" - 根据策略,忽略 {nugetFixStrategy.NugetName} 存在的问题"); return(true); } var targetFramework = packageElementList.First().Attribute(PackagesConfig.TargetFrameworkAttribute).Value; for (var i = 0; i < packageElementList.Count; i++) { if (i == 0) { var firstPackageElement = packageElementList[i]; firstPackageElement.SetAttributeValue(PackagesConfig.IdAttribute, nugetFixStrategy.NugetName); firstPackageElement.SetAttributeValue(PackagesConfig.VersionAttribute, nugetFixStrategy.NugetVersion); firstPackageElement.SetAttributeValue(PackagesConfig.TargetFrameworkAttribute, targetFramework); Log = StringSplicer.SpliceWithNewLine(Log, $" - 将 {nugetFixStrategy.NugetName} 设定为 {nugetFixStrategy.NugetVersion}"); continue; } packageElementList[i].Remove(); } if (packageElementList.Count > 1) { Log = StringSplicer.SpliceWithNewLine(Log, $" - 删除了 {nugetFixStrategy.NugetName} 的 {packageElementList.Count - 1} 个冲突引用"); } return(true); }
/// <summary> /// 执行修复 /// </summary> /// <returns>是否修复成功</returns> public bool Repair() { try { _xDocument = _nugetConfigFixHelper.Fix(); var headerMessage = $"对 {_configPath} 执行了以下修复操作:"; Log = StringSplicer.SpliceWithNewLine(headerMessage, _nugetConfigFixHelper.Log); _xDocument.Save(_configPath); return(true); } catch (Exception e) { Log = StringSplicer.SpliceWithNewLine(e.Message, e.StackTrace); return(false); } }
private void FixPackageReferences(IEnumerable <XElement> packageReferences, NugetFixStrategy nugetFixStrategy) { var packageReferenceList = packageReferences.ToList(); var parentItemGroup = packageReferenceList.First().Parent; for (var i = 0; i < packageReferenceList.Count; i++) { if (i != 0) { packageReferenceList[i].Remove(); continue; } var removeAttributeList = new[] { "Private", "HintPath" }; var firstPackageReference = packageReferenceList[i]; if (firstPackageReference.Elements().Any()) { foreach (var attribute in removeAttributeList) { firstPackageReference.Element(attribute)?.Remove(); } Log = StringSplicer.SpliceWithNewLine(Log, $" - 更新了 {nugetFixStrategy.NugetName} 的版本声明格式"); } Log = StringSplicer.SpliceWithNewLine(Log, $" - 将 {nugetFixStrategy.NugetName} 设定为 {nugetFixStrategy.NugetVersion}"); foreach (var attribute in removeAttributeList) { // 设置为 null 将删除属性 firstPackageReference.SetAttributeValue(attribute, null); } firstPackageReference.SetAttributeValue(CsProj.IncludeAttribute, nugetFixStrategy.NugetName); firstPackageReference.SetAttributeValue(CsProj.VersionAttribute, nugetFixStrategy.NugetVersion); } if (packageReferenceList.Count > 1) { Log = StringSplicer.SpliceWithNewLine(Log, $" - 删除了 {nugetFixStrategy.NugetName} 的 {packageReferenceList.Count - 1} 个冲突引用"); } }
private void CheckNugetVersion() { var projectFiles = GetProjectFilesFromSolutionFile(_solutionFilePath); var projectDirectories = projectFiles.Select(Path.GetDirectoryName); var nugetConfigFiles = new List <string>(); foreach (var projectDirectory in projectDirectories) { nugetConfigFiles.AddRange(GetNugetConfigFiles(projectDirectory)); } var badFormatNugetConfigList = new List <NugetConfigReader>(); var goodFormatNugetInfoExList = new List <NugetInfoEx>(); foreach (var nugetConfigFile in nugetConfigFiles) { var nugetConfigReader = new NugetConfigReader(nugetConfigFile); if (nugetConfigReader.IsGoodFormat()) { goodFormatNugetInfoExList.AddRange(nugetConfigReader.PackageInfoExs); } else { badFormatNugetConfigList.Add(nugetConfigReader); } } ErrorFormatNugetConfigs = badFormatNugetConfigList; MismatchVersionNugetInfoExs = GetMismatchVersionNugets(goodFormatNugetInfoExList); var nugetMismatchVersionMessage = CreateNugetMismatchVersionMessage(MismatchVersionNugetInfoExs); foreach (var errorFormatNugetConfig in ErrorFormatNugetConfigs) { Message = StringSplicer.SpliceWithDoubleNewLine(Message, errorFormatNugetConfig.ErrorMessage); } Message = StringSplicer.SpliceWithDoubleNewLine(Message, nugetMismatchVersionMessage); if (string.IsNullOrEmpty(Message)) { Message = "完美无瑕!"; } }
private void ButtonFix_OnClick(object sender, RoutedEventArgs e) { var nugetVersionFixWindow = new NugetVersionFixWindow(_nugetVersionChecker.MismatchVersionNugetInfoExs) { Owner = this }; nugetVersionFixWindow.NugetFixStrategiesSelected += (o, args) => { var nugetFixStrategies = args.NugetFixStrategies; if (nugetFixStrategies == null || !nugetFixStrategies.Any()) { return; } var repairLog = string.Empty; foreach (var mismatchVersionNugetInfoEx in _nugetVersionChecker.MismatchVersionNugetInfoExs) { foreach (var nugetInfoEx in mismatchVersionNugetInfoEx.VersionUnusualNugetInfoExs) { var nugetConfigRepairer = new NugetConfigRepairer(nugetInfoEx.ConfigPath, nugetFixStrategies); nugetConfigRepairer.Repair(); repairLog = StringSplicer.SpliceWithDoubleNewLine(repairLog, nugetConfigRepairer.Log); } } TextBoxErrorMessage.Text = repairLog; ButtonFixVersion.IsEnabled = false; nugetVersionFixWindow.Close(); }; try { nugetVersionFixWindow.ShowDialog(); } catch (Exception exception) { MessageBox.Show(exception.Message); } }
private string CreateNugetMismatchVersionMessage( [NotNull] IEnumerable <VersionUnusualNugetInfoExGroup> mismatchVersionNugetInfoExs) { var nugetMismatchVersionMessage = string.Empty; foreach (var mismatchVersionNugetInfoEx in mismatchVersionNugetInfoExs) { var headMessage = $"{mismatchVersionNugetInfoEx.NugetName} 存在版本异常:"; var detailMessage = string.Empty; foreach (var nugetPackageInfo in mismatchVersionNugetInfoEx.VersionUnusualNugetInfoExs) { var mainDetailMessage = $" {nugetPackageInfo.Version},{nugetPackageInfo.ConfigPath}"; detailMessage = StringSplicer.SpliceWithNewLine(detailMessage, mainDetailMessage); } var singleNugetMismatchVersionMessage = StringSplicer.SpliceWithNewLine(headMessage, detailMessage); nugetMismatchVersionMessage = StringSplicer.SpliceWithDoubleNewLine(nugetMismatchVersionMessage, singleNugetMismatchVersionMessage); } return(nugetMismatchVersionMessage); }
private void ButtonFix_OnClick(object sender, RoutedEventArgs e) { _nugetFixStrategyList.Clear(); foreach (var child in PanelNugetVersionSelectors.Children) { if (!(child is NugetVersionSelectorUserControl nugetVersionSelectorUserControl)) { continue; } var nugetName = nugetVersionSelectorUserControl.NugetName; var selectedVersion = nugetVersionSelectorUserControl.SelectedVersion; var versionUnusualNugetInfoExGroup = _mismatchVersionNugetInfoExs.FirstOrDefault(x => x.NugetName == nugetName); if (versionUnusualNugetInfoExGroup == null) { continue; } var selectedVersionNugetInfoExs = versionUnusualNugetInfoExGroup.VersionUnusualNugetInfoExs.Where(x => x.Version == selectedVersion) .ToList(); var targetFrameworks = selectedVersionNugetInfoExs.Where(x => x.TargetFramework != null) .Select(x => x.TargetFramework).Distinct().ToList(); targetFrameworks.Sort(); targetFrameworks.Reverse(); var nugetDllInfos = selectedVersionNugetInfoExs.Where(x => x.NugetDllInfo != null) .Select(x => x.NugetDllInfo).Distinct().ToList(); var dllPaths = nugetDllInfos.Select(x => x.DllPath).Distinct().ToList(); if (dllPaths.Count > 1) { var errorMessage = "指定的修复策略存在多个 Dll 路径,修复工具无法确定应该使用哪一个。请保留现场并联系开发者。"; var dllPathMessage = string.Empty; foreach (var dllPath in dllPaths) { dllPathMessage = StringSplicer.SpliceWithNewLine(dllPathMessage, dllPath); } errorMessage = StringSplicer.SpliceWithDoubleNewLine(errorMessage, dllPathMessage); MessageBox.Show(errorMessage); continue; } var nugetDllInfo = nugetDllInfos.FirstOrDefault(); if (nugetDllInfo != null) { _nugetFixStrategyList.Add(new NugetFixStrategy(nugetName, selectedVersion, nugetDllInfo)); } else { var targetFramework = targetFrameworks.FirstOrDefault(); if (targetFramework == null) { _nugetFixStrategyList.Add( new NugetFixStrategy(nugetName, selectedVersion, new NugetDllInfo("", ""))); } else { _nugetFixStrategyList.Add( new NugetFixStrategy(nugetName, selectedVersion, targetFramework)); } } } if (!_nugetFixStrategyList.Any()) { return; } NugetFixStrategiesSelected?.Invoke(this, new NugetFixStrategiesEventArgs(_nugetFixStrategyList)); }