Exemplo n.º 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);
        }
Exemplo n.º 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);
        }
Exemplo n.º 4
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} 个冲突引用");
            }
        }
 /// <summary>
 /// 使用指定的策略进行修复
 /// </summary>
 /// <param name="nugetFixStrategy">修复策略</param>
 /// <returns>策略是否有效执行</returns>
 protected abstract bool FixDocumentByStrategy(NugetFixStrategy nugetFixStrategy);