private static void Run(CommandLineApplication cmd, ILogger log)
        {
            cmd.Description = "Add framework assemblies to the nuspec file for desktop frameworks.";

            var idFilter             = cmd.Option(Constants.IdFilterTemplate, Constants.IdFilterDesc, CommandOptionType.SingleValue);
            var versionFilter        = cmd.Option(Constants.VersionFilterTemplate, Constants.VersionFilterDesc, CommandOptionType.SingleValue);
            var excludeSymbolsFilter = cmd.Option(Constants.ExcludeSymbolsTemplate, Constants.ExcludeSymbolsDesc, CommandOptionType.NoValue);
            var highestVersionFilter = cmd.Option(Constants.HighestVersionFilterTemplate, Constants.HighestVersionFilterDesc, CommandOptionType.NoValue);

            var assemblyNames    = cmd.Option("-n|--assembly-name", "AssemblyName value of the FrameworkAssembly entry. May be specified multiple times.", CommandOptionType.MultipleValue);
            var targetFrameworks = cmd.Option("-f|--framework", "TargetFramework value of the FrameworkAssembly entry. If no frameworks are given this command will automatically add the reference for all desktop frameworks. Framework may be specified multiple time.", CommandOptionType.MultipleValue);
            var noFrameworks     = cmd.Option("--no-frameworks", "Exclude the TargetFramework attribute.", CommandOptionType.NoValue);

            var argRoot = cmd.Argument(
                "[root]",
                Constants.MultiplePackagesRootDesc,
                multipleValues: true);

            cmd.HelpOption(Constants.HelpOption);

            cmd.OnExecute(() =>
            {
                try
                {
                    // Validate required parameters
                    CmdUtils.VerifyRequiredOptions(assemblyNames);
                    CmdUtils.VerifyMutallyExclusiveOptions(targetFrameworks, noFrameworks);

                    var inputs = argRoot.Values;

                    if (inputs.Count < 1)
                    {
                        inputs.Add(Directory.GetCurrentDirectory());
                    }

                    var packages = Util.GetPackagesWithFilter(idFilter, versionFilter, excludeSymbolsFilter, highestVersionFilter, inputs.ToArray());

                    foreach (var package in packages)
                    {
                        log.LogMinimal($"modifying {package}");

                        // Get nuspec file path
                        string nuspecPath         = null;
                        XDocument nuspecXml       = null;
                        NuspecReader nuspecReader = null;
                        var packageFrameworks     = new List <NuGetFramework>();
                        using (var stream = File.OpenRead(package))
                            using (var packageReader = new PackageArchiveReader(stream, leaveStreamOpen: false))
                            {
                                nuspecPath   = packageReader.GetNuspecFile();
                                nuspecXml    = XDocument.Load(packageReader.GetNuspec());
                                nuspecReader = packageReader.NuspecReader;

                                packageFrameworks.AddRange(packageReader.GetSupportedFrameworks().Where(e => e.IsSpecificFramework));
                            }

                        var frameworks = new HashSet <NuGetFramework>();

                        if (!noFrameworks.HasValue())
                        {
                            if (targetFrameworks.HasValue())
                            {
                                // Validate user input
                                ValidateTargetFrameworkInputs(targetFrameworks.Values);

                                // Add user input frameworks
                                frameworks.AddRange(targetFrameworks.Values.Select(e => NuGetFramework.Parse(e)));
                            }
                            else
                            {
                                frameworks.AddRange(packageFrameworks);
                            }
                        }

                        // Remove unknown frameworks and package based frameworks.
                        frameworks.RemoveWhere(e => !e.IsSpecificFramework || e.IsPackageBased);

                        var assemblyNamesUnique = new HashSet <string>(assemblyNames.Values, StringComparer.OrdinalIgnoreCase);

                        log.LogMinimal($"Adding framework assemblies: {string.Join(", ", assemblyNamesUnique)}");

                        // Modify nuspec
                        Util.AddFrameworkAssemblyReferences(nuspecXml, assemblyNamesUnique, frameworks);

                        // Update zip
                        Util.AddOrReplaceZipEntry(package, nuspecPath, nuspecXml, log);
                    }

                    return(0);
                }
                catch (Exception ex)
                {
                    log.LogError(ex.Message);
                    log.LogDebug(ex.ToString());
                }

                return(1);
            });
        }
예제 #2
0
        private static void Run(CommandLineApplication cmd, ILogger log)
        {
            cmd.Description = "Modify package dependencies. If no dependency id is specified all dependencies matched will be modified to the version, exclude, or include given.";

            // Filters
            var idFilter             = cmd.Option(Constants.IdFilterTemplate, Constants.IdFilterDesc, CommandOptionType.SingleValue);
            var versionFilter        = cmd.Option(Constants.VersionFilterTemplate, Constants.VersionFilterDesc, CommandOptionType.SingleValue);
            var excludeSymbolsFilter = cmd.Option(Constants.ExcludeSymbolsTemplate, Constants.ExcludeSymbolsDesc, CommandOptionType.NoValue);
            var highestVersionFilter = cmd.Option(Constants.HighestVersionFilterTemplate, Constants.HighestVersionFilterDesc, CommandOptionType.NoValue);

            // Command options
            var frameworkOption         = cmd.Option(Constants.FrameworkOptionTemplate, Constants.FrameworkOptionDesc, CommandOptionType.MultipleValue);
            var editExclude             = cmd.Option(Constants.DependencyExcludeAttributeTemplate, Constants.DependencyExcludeAttributeDesc, CommandOptionType.SingleValue);
            var editInclude             = cmd.Option(Constants.DependencyIncludeAttributeTemplate, Constants.DependencyIncludeAttributeDesc, CommandOptionType.SingleValue);
            var dependencyVersionOption = cmd.Option(Constants.DependencyVersionRangeTemplate, Constants.DependencyVersionRangeDesc, CommandOptionType.SingleValue);
            var dependencyIdOption      = cmd.Option(Constants.DependencyIdTemplate, Constants.DependencyIdDesc, CommandOptionType.SingleValue);

            var clearExclude = cmd.Option("--clear-exclude", "Clear exclude attribute.", CommandOptionType.NoValue);
            var clearInclude = cmd.Option("--clear-include", "Clear include attribute.", CommandOptionType.NoValue);

            var argRoot = cmd.Argument(
                "[root]",
                Constants.MultiplePackagesRootDesc,
                true);

            cmd.HelpOption(Constants.HelpOption);

            cmd.OnExecute(() =>
            {
                try
                {
                    // Validate parameters
                    CmdUtils.VerifyOneOptionExists(editInclude, editExclude, dependencyVersionOption, clearInclude, clearExclude);
                    CmdUtils.VerifyMutallyExclusiveOptions(editExclude, clearExclude);
                    CmdUtils.VerifyMutallyExclusiveOptions(editInclude, clearInclude);

                    var inputs = argRoot.Values;

                    if (inputs.Count < 1)
                    {
                        inputs.Add(Directory.GetCurrentDirectory());
                    }

                    var dependencyId = dependencyIdOption.HasValue() ? dependencyIdOption.Value() : null;

                    var editForFrameworks = new HashSet <NuGetFramework>();
                    if (frameworkOption.HasValue())
                    {
                        editForFrameworks.UnionWith(frameworkOption.Values.Select(NuGetFramework.Parse));

                        if (string.IsNullOrEmpty(dependencyId))
                        {
                            log.LogInformation($"modifying all dependencies in {string.Join(", ", editForFrameworks.Select(e => e.GetShortFolderName()))}");
                        }
                        else
                        {
                            log.LogInformation($"modifying dependency {dependencyId} in {string.Join(", ", editForFrameworks.Select(e => e.GetShortFolderName()))}");
                        }
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(dependencyId))
                        {
                            log.LogInformation($"modifying all dependencies");
                        }
                        else
                        {
                            log.LogInformation($"modifying dependency {dependencyId} in all frameworks");
                        }
                    }

                    var version = dependencyVersionOption.HasValue() ? dependencyVersionOption.Value() : null;
                    var exclude = editExclude.HasValue() ? editExclude.Value() : null;
                    var include = editInclude.HasValue() ? editInclude.Value() : null;

                    var packages = Util.GetPackagesWithFilter(idFilter, versionFilter, excludeSymbolsFilter, highestVersionFilter, inputs.ToArray());

                    foreach (var package in packages)
                    {
                        log.LogMinimal($"processing {package}");

                        var nuspecXml = Util.GetNuspec(package);

                        DependenciesUtil.Process(nuspecXml, DependenciesUtil.EditType.Modify, editForFrameworks, dependencyId, version, exclude, include, clearExclude.HasValue(), clearInclude.HasValue(), log);

                        Util.ReplaceNuspec(package, nuspecXml, log);
                    }

                    return(0);
                }
                catch (Exception ex)
                {
                    log.LogError(ex.Message);
                    log.LogError(ex.ToString());
                }

                return(1);
            });
        }