Пример #1
0
        private Assembly TryLoadBuildScriptFromAssembly(string buildScriptAssemblyPath, string buildScriptFilePath, ScriptAnalyzerResult scriptAnalyzerResult, ProjectFileAnalyzerResult projectFileAnalyzerResult)
        {
            if (!File.Exists(buildScriptAssemblyPath))
            {
                return(null);
            }

            var buildScriptAssemblyModified = File.GetLastWriteTime(buildScriptAssemblyPath);
            var buildScriptFileModified     = File.GetLastWriteTime(buildScriptFilePath);

            if (buildScriptFileModified > buildScriptAssemblyModified)
            {
                return(null);
            }

            if (projectFileAnalyzerResult.ProjectFileFound)
            {
                var projectFileModified = File.GetLastWriteTime(projectFileAnalyzerResult.ProjectFileLocation);
                if (projectFileModified > buildScriptAssemblyModified)
                {
                    return(null);
                }
            }

            foreach (var csFile in scriptAnalyzerResult.CsFiles)
            {
                if (File.Exists(csFile))
                {
                    var csFileModifiedTime = File.GetLastWriteTime(csFile);
                    if (csFileModifiedTime > buildScriptAssemblyModified)
                    {
                        return(null);
                    }
                }
            }

            foreach (var partialCsFile in scriptAnalyzerResult.PartialCsFiles)
            {
                var csFileModifiedTime = File.GetLastWriteTime(partialCsFile);
                if (csFileModifiedTime > buildScriptAssemblyModified)
                {
                    return(null);
                }
            }

#if NETSTANDARD1_6
            using (FileStream dllStream = new FileStream(buildScriptAssemblyPath, FileMode.Open, FileAccess.Read))
            {
                using (FileStream pdbStream = new FileStream(Path.ChangeExtension(buildScriptAssemblyPath, "pdb"), FileMode.Open, FileAccess.Read))
                {
                    return(AssemblyLoadContext.Default.LoadFromStream(dllStream, pdbStream));
                }
            }
#else
            return(Assembly.Load(File.ReadAllBytes(buildScriptAssemblyPath), File.ReadAllBytes(Path.ChangeExtension(buildScriptAssemblyPath, "pdb"))));
#endif
        }
Пример #2
0
        private IEnumerable <MetadataReference> GetBuildScriptReferences(CommandArguments args, ProjectFileAnalyzerResult projectFileAnalyzerResult, ScriptAnalyzerResult scriptAnalyzerResult, bool oldWay, string pathToBuildScript)
        {
            var coreDir           = Path.GetDirectoryName(typeof(object).GetTypeInfo().Assembly.Location);
            var flubuCoreAssembly = typeof(DefaultBuildScript).GetTypeInfo().Assembly;

            //// Default assemblies that should be referenced.
            var assemblyReferences = oldWay
                ? GetBuildScriptReferencesForOldWayBuildScriptCreation()
                : GetDefaultReferences(coreDir);

            // Enumerate all assemblies referenced by FlubuCore
            // and provide them as references to the build script we're about to
            // compile.
            AssemblyName[] flubuReferencedAssemblies = flubuCoreAssembly.GetReferencedAssemblies();
            foreach (var referencedAssembly in flubuReferencedAssemblies)
            {
                Assembly loadedAssembly = Assembly.Load(referencedAssembly);
                if (string.IsNullOrEmpty(loadedAssembly.Location))
                {
                    continue;
                }

                assemblyReferences.AddOrUpdateAssemblyInfo(new AssemblyInfo
                {
                    Name     = referencedAssembly.Name,
                    Version  = referencedAssembly.Version,
                    FullPath = loadedAssembly.Location,
                });
            }

            assemblyReferences.AddOrUpdateAssemblyInfo(scriptAnalyzerResult.AssemblyReferences);

            assemblyReferences.AddOrUpdateAssemblyInfo(projectFileAnalyzerResult.HasAnyNugetReferences
                ? _nugetPackageResolver.ResolveNugetPackagesFromFlubuCsproj(projectFileAnalyzerResult)
                : _nugetPackageResolver.ResolveNugetPackagesFromDirectives(scriptAnalyzerResult.NugetPackageReferences, pathToBuildScript));

            AddAssemblyReferencesFromCsproj(projectFileAnalyzerResult, assemblyReferences);

            var assemblyReferencesLocations = assemblyReferences.Select(x => x.FullPath).ToList();

            assemblyReferencesLocations.AddRange(FindAssemblyReferencesInDirectories(args.AssemblyDirectories));
            assemblyReferencesLocations =
                assemblyReferencesLocations.Distinct().Where(x => !string.IsNullOrEmpty(x)).ToList();

            var references = assemblyReferencesLocations.Select(i =>
            {
                return(MetadataReference.CreateFromFile(i));
            });

#if !NET462
            foreach (var assemblyReferenceLocation in assemblyReferencesLocations)
            {
                try
                {
                    AssemblyLoadContext.Default.LoadFromAssemblyPath(assemblyReferenceLocation);
                }
                catch (Exception)
                {
                }
            }
#endif
            return(references);
        }
Пример #3
0
        public List <AssemblyInfo> ResolveNugetPackagesFromFlubuCsproj(ProjectFileAnalyzerResult analyzerResult)
        {
            List <AssemblyInfo> assemblyReferences = new List <AssemblyInfo>();
            var nugetReferences = analyzerResult.NugetReferences.Where(x =>
                                                                       !x.Id.Equals("FlubuCore", StringComparison.OrdinalIgnoreCase) &&
                                                                       !x.Id.Equals("dotnet-flubu", StringComparison.OrdinalIgnoreCase) &&
                                                                       !x.Id.Equals("FlubuCore.Runner", StringComparison.OrdinalIgnoreCase) &&
                                                                       !x.Id.StartsWith("StyleCop", StringComparison.OrdinalIgnoreCase)).ToList();

            if (nugetReferences.Count == 0)
            {
                return(assemblyReferences);
            }

            string csprojLocation = analyzerResult.ProjectFileLocation;

            var  csprojDir                = Path.GetDirectoryName(csprojLocation);
            var  csprojfileName           = Path.GetFileName(csprojLocation);
            var  nugetPropsLocation       = Path.Combine(csprojDir, "obj", csprojfileName + ".nuget.g.props");
            bool nugetPropsFileExists     = _file.Exists(nugetPropsLocation);
            bool mustRestoreNugetPackages = true;

            if (nugetPropsFileExists)
            {
#pragma warning disable SA1305 // Field names should not use Hungarian notation
                var csProjModifiedTime = File.GetLastWriteTime(csprojLocation);
#pragma warning restore SA1305 // Field names should not use Hungarian notation
                var nugetProsModifiedTime = File.GetLastWriteTime(nugetPropsLocation);
                if (nugetProsModifiedTime > csProjModifiedTime)
                {
                    mustRestoreNugetPackages = false;
                }
            }

            var targetFramework = GetTargetFramework();

            if (mustRestoreNugetPackages)
            {
                if (nugetPropsFileExists)
                {
                    File.Delete(nugetPropsLocation);
                }

                RestoreNugetPackages(csprojLocation);
            }

            var document       = XDocument.Load(nugetPropsLocation);
            var packageFolders = document.Descendants().Single(d => d.Name.LocalName == "NuGetPackageFolders").Value
                                 .Split(';');

            var dependencyContext = ReadDependencyContext(Path.Combine(csprojDir, "obj", "project.assets.json"));

            var compileLibraries = dependencyContext.CompileLibraries.ToList();
            foreach (var packageReference in nugetReferences)
            {
                CompilationLibrary compileLibrary = compileLibraries.FirstOrDefault(x =>
                                                                                    x.Name.Equals(packageReference.Id, StringComparison.OrdinalIgnoreCase));

                if (compileLibrary == null)
                {
                    throw new ScriptException(
                              $"Nuget package '{packageReference.Id}' '{packageReference.Version}' not found.");
                }

                if (compileLibrary.Assemblies.Count != 0)
                {
                    bool packageFound = AddAssemblyReference(packageFolders, compileLibrary, assemblyReferences);

                    if (!packageFound)
                    {
                        throw new ScriptException($"Nuget package {packageReference.Id} not found.");
                    }

                    ResolveDependencies(compileLibrary, compileLibraries, packageFolders, assemblyReferences);
                }
                else
                {
                    if (compileLibrary.Dependencies.Count != 0)
                    {
                        ResolveDependencies(compileLibrary, compileLibraries, packageFolders, assemblyReferences);
                    }
                    else
                    {
                        throw new ScriptException($"Nuget package '{packageReference.Id}' '{packageReference.Version}' not found for framework {targetFramework} ");
                    }
                }
            }

            File.Delete(NugetPackageResolveConstants.GeneratedProjectFileName);

            return(assemblyReferences);
        }