예제 #1
0
        private void LoadFiles(
            string packageDir,
            IEnumerable <IPackageReference> packageReferences,
            List <string> foundAssemblies,
            bool strictLoad = true)
        {
            foreach (var packageRef in packageReferences)
            {
                var nugetPackage = _packageContainer.FindPackage(packageDir, packageRef);
                if (nugetPackage == null)
                {
                    _logger.WarnFormat(
                        CultureInfo.InvariantCulture,
                        "Cannot find: {0} {1}",
                        packageRef.PackageId,
                        packageRef.Version);

                    continue;
                }

                var compatibleFiles = nugetPackage.GetCompatibleDlls(packageRef.FrameworkName);
                if (compatibleFiles == null)
                {
                    _logger.WarnFormat(
                        CultureInfo.InvariantCulture,
                        "Cannot find compatible binaries for {0} in: {1} {2}",
                        packageRef.FrameworkName,
                        packageRef.PackageId,
                        packageRef.Version);

                    continue;
                }

                var compatibleFilePaths = compatibleFiles
                                          .Select(packageFile => Path.Combine(packageDir, nugetPackage.FullName, packageFile))
                                          .Concat(nugetPackage.FrameworkAssemblies);

                foreach (var path in compatibleFilePaths)
                {
                    if (foundAssemblies.Contains(path))
                    {
                        continue;
                    }

                    foundAssemblies.Add(path);
                    _logger.Debug("Found: " + path);
                }

                if (nugetPackage.Dependencies == null || !nugetPackage.Dependencies.Any() || !strictLoad)
                {
                    continue;
                }

                var dependencyReferences = nugetPackage.Dependencies
                                           .Where(i => _topLevelPackages.All(x => x.PackageId != i.Id))
                                           .Select(i => new PackageReference(i.Id, i.FrameworkName, i.Version));

                LoadFiles(packageDir, dependencyReferences, foundAssemblies, true);
            }
        }
예제 #2
0
        private void LoadFiles(string packageDir, IEnumerable <IPackageReference> packageReferences, ref List <IPackageReference> missingAssemblies, ref List <string> foundAssemblies, bool strictLoad = true, Action <string> outputCallback = null)
        {
            foreach (var packageRef in packageReferences)
            {
                var nugetPackage = _packageContainer.FindPackage(packageDir, packageRef);
                if (nugetPackage == null)
                {
                    missingAssemblies.Add(packageRef);
                    if (outputCallback != null)
                    {
                        outputCallback("Cannot find: " + packageRef.PackageId + " " + packageRef.Version);
                    }

                    continue;
                }

                var compatibleFiles = nugetPackage.GetCompatibleDlls(packageRef.FrameworkName);
                if (compatibleFiles == null)
                {
                    missingAssemblies.Add(packageRef);
                    if (outputCallback != null)
                    {
                        outputCallback("Cannot find binaries for " + packageRef.FrameworkName + " in: " +
                                       packageRef.PackageId + " " + packageRef.Version);
                    }

                    continue;
                }

                var compatibleFilePaths = compatibleFiles.Select(packageFile => Path.Combine(packageDir, nugetPackage.FullName, packageFile));

                foreach (var path in compatibleFilePaths)
                {
                    if (foundAssemblies.Contains(path))
                    {
                        continue;
                    }

                    foundAssemblies.Add(path);
                    if (outputCallback != null)
                    {
                        outputCallback("Found: " + path);
                    }
                }

                if (nugetPackage.Dependencies == null || !nugetPackage.Dependencies.Any() || !strictLoad)
                {
                    continue;
                }

                var dependencyReferences = nugetPackage.Dependencies
                                           .Where(i => _topLevelPackages.All(x => x.PackageId != i.Id))
                                           .Select(i => new PackageReference(i.Id, i.FrameworkName, i.Version));

                LoadFiles(packageDir, dependencyReferences, ref missingAssemblies, ref foundAssemblies, true, outputCallback);
            }
        }
예제 #3
0
        private void GetAssemblyNames(
            string packageDir,
            IEnumerable <IPackageReference> packageReferences,
            ICollection <string> names,
            bool strictLoad)
        {
            foreach (var packageReference in packageReferences)
            {
                var packageObject = _packageContainer.FindPackage(packageDir, packageReference);
                if (packageObject == null)
                {
                    _logger.WarnFormat(
                        CultureInfo.InvariantCulture,
                        "Cannot find: {0} {1}",
                        packageReference.PackageId,
                        packageReference.Version);

                    continue;
                }

                var compatibleDlls = packageObject.GetCompatibleDlls(packageReference.FrameworkName);
                if (compatibleDlls == null)
                {
                    _logger.WarnFormat(
                        CultureInfo.InvariantCulture,
                        "Cannot find compatible binaries for {0} in: {1} {2}",
                        packageReference.FrameworkName,
                        packageReference.PackageId,
                        packageReference.Version);

                    continue;
                }

                foreach (var name in compatibleDlls
                         .Select(packageFile => Path.Combine(packageDir, packageObject.FullName, packageFile))
                         .Where(path => _assemblyUtility.IsManagedAssembly(path))
                         .Concat(packageObject.FrameworkAssemblies)
                         .Where(name => !names.Contains(name)))
                {
                    names.Add(name);
                    _logger.Debug("Found: " + name);
                }

                if (packageObject.Dependencies == null || !packageObject.Dependencies.Any() || !strictLoad)
                {
                    continue;
                }

                var dependencyReferences = packageObject.Dependencies
                                           .Where(dependency =>
                                                  _topLevelPackages.All(topLevelPackage => topLevelPackage.PackageId != dependency.Id))
                                           .Select(dependency =>
                                                   new PackageReference(dependency.Id, dependency.FrameworkName, dependency.Version));

                GetAssemblyNames(packageDir, dependencyReferences, names, true);
            }
        }
        protected internal virtual void ProcessPackage(
            string packagesPath,
            IPackageReference reference,
            StringBuilder builder,
            List <string> references,
            List <string> namespaces)
        {
            Guard.AgainstNullArgument("reference", reference);
            Guard.AgainstNullArgument("builder", builder);
            Guard.AgainstNullArgument("references", references);
            Guard.AgainstNullArgument("namespaces", namespaces);

            _logger.DebugFormat("Finding package:{0}", reference.PackageId);
            var package = _packageContainer.FindPackage(packagesPath, reference);

            if (package == null)
            {
                _logger.WarnFormat("Package missing: {0}", reference.PackageId);
                return;
            }

            _logger.Debug("Package found");
            var script = GetMainScript(package);

            if (script != null)
            {
                script = Path.Combine(packagesPath, string.Format("{0}.{1}", package.Id, package.TextVersion), script);
                _logger.Debug("Pre-processing script");
                var result = _preProcessor.ProcessFile(script);
                var fileWithoutExtension = Path.GetFileNameWithoutExtension(script);
                var classname            = fileWithoutExtension.Substring(0, fileWithoutExtension.Length - 4);
                _logger.DebugFormat("Created Script Libary class: {0}", classname);
                var classBuilder = new StringBuilder();
                classBuilder.AppendFormat("public class {0} : ScriptCs.ScriptLibraryWrapper {{{1}", classname, Environment.NewLine);
                classBuilder.AppendLine(result.Code);
                classBuilder.AppendLine("}");
                var classDefinition = classBuilder.ToString();
                _logger.TraceFormat("Class definition:{0}{0}{1}", Environment.NewLine, classDefinition);
                builder.Append(classDefinition);
                references.AddRange(result.References);
                namespaces.AddRange(result.Namespaces);
            }
        }