示例#1
0
        /// <summary>
        /// Resolves solution tool package.
        ///
        /// If .SolutionToolPackage is null, looking for NuGet package tags, and then into solution
        /// </summary>
        /// <returns></returns>
        protected virtual SolutionToolPackage ResolveSolutionToolPackage(IPackage package)
        {
            MetaPackTrace.Verbose("Resolving solution tool packages...");

            SolutionToolPackage result = null;

            if (SolutionToolPackage == null)
            {
                MetaPackTrace.Verbose(".SolutionToolPackage is null. Switching to tags and solution itself");

                // resolve from the tags
                var tags = string.IsNullOrEmpty(package.Tags)
                            ? package.Tags.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries)
                            : Enumerable.Empty <string>();

                var packageId      = ExtractTagValueByPrefix(tags, "metapack-toolid-");
                var packageVersion = ExtractTagValueByPrefix(tags, "metapack-toolid-");

                if (!string.IsNullOrEmpty(packageId))
                {
                    MetaPackTrace.Verbose(String.Format("Found tool. ToolId:[{0}] ToolVersion:[{1}]", packageId, packageVersion));

                    result = new SolutionToolPackage
                    {
                        Id      = packageId,
                        Version = packageVersion
                    };
                }
                else
                {
                    MetaPackTrace.Verbose("Solution package tags don't have tool package defined. Switching to solution options.");

                    var defaultSolutionPackagingService = new DefaultNuGetSolutionPackageService();
                    var solutionPackageFile             = defaultSolutionPackagingService.FindSolutionPackageFile(package);

                    var serializationService = new DefaultXMLSerializationService();
                    serializationService.RegisterKnownType(typeof(SolutionPackageBase));

                    MetaPackTrace.Verbose("Unpacking solution package...");
                    using (var streamReader = new StreamReader(solutionPackageFile.GetStream()))
                    {
                        var solutionFileContent = streamReader.ReadToEnd();

                        var xDoc            = XDocument.Parse(solutionFileContent);
                        var rootElementName = xDoc.Root.Name.LocalName;

                        var defNamespace  = xDoc.Root.Attribute("xmlns").Value;
                        var genericXmlDoc = xDoc.ToString()
                                            .Replace(
                            string.Format("<{0}", rootElementName),
                            string.Format("<{0}", typeof(SolutionPackageBase).Name))
                                            .Replace(
                            string.Format("</{0}>", rootElementName),
                            string.Format("</{0}>", typeof(SolutionPackageBase).Name))

                                            .Replace(defNamespace, "http://schemas.datacontract.org/2004/07/MetaPack.Core.Packaging");

                        var typedPackage = serializationService.Deserialize(
                            typeof(SolutionPackageBase), genericXmlDoc)
                                           as SolutionPackageBase;

                        var packageIdFromPackage      = ExtractAdditionalOption(typedPackage.AdditionalOptions, DefaultOptions.SolutionToolPackage.PackageId.Id);
                        var packageVersionFromPackage = ExtractAdditionalOption(typedPackage.AdditionalOptions, DefaultOptions.SolutionToolPackage.PackageVersion.Id);

                        if (!string.IsNullOrEmpty(packageIdFromPackage))
                        {
                            MetaPackTrace.Verbose(string.Format("Found tool. ToolId:[{0}] ToolVersion:[{1}]", packageIdFromPackage, packageVersionFromPackage));

                            result = new SolutionToolPackage
                            {
                                Id      = packageIdFromPackage,
                                Version = packageVersionFromPackage
                            };
                        }
                        else
                        {
                            MetaPackTrace.Verbose("Cannot find any solution tool package options in SolutionPackage.AdditionalOptions");
                        }
                    }
                }

                if (result == null)
                {
                    throw new MetaPackException("Can't resolve solution tool package from .SolutionToolPackage, tags and solution package itself");
                }
            }
            else
            {
                MetaPackTrace.Verbose("SolutionToolPackage is preefined by external input.");
                result = SolutionToolPackage;
            }

            return(result);
        }
示例#2
0
 internal void InstallTool(SolutionToolPackage toolPackage)
 {
     InstallTool(toolPackage.Id, toolPackage.Version);
 }