Example #1
0
        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);
        }
Example #2
0
        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);
     }
 }
Example #5
0
        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);
        }
Example #9
0
        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));
        }