mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Update build provider to load assembly references
The build provider for .csproj file of modules now tries to load all assembly reference specified in the "references" section of the csproj file. --HG-- branch : perf
This commit is contained in:
@@ -3,6 +3,7 @@ using System.CodeDom;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using Orchard.Environment.Extensions.Loaders;
|
using Orchard.Environment.Extensions.Loaders;
|
||||||
using Orchard.FileSystems.Dependencies;
|
using Orchard.FileSystems.Dependencies;
|
||||||
using Orchard.FileSystems.VirtualPath;
|
using Orchard.FileSystems.VirtualPath;
|
||||||
@@ -18,17 +19,20 @@ namespace Orchard.Environment.Extensions.Compilers {
|
|||||||
private readonly IProjectFileParser _projectFileParser;
|
private readonly IProjectFileParser _projectFileParser;
|
||||||
private readonly IDependenciesFolder _dependenciesFolder;
|
private readonly IDependenciesFolder _dependenciesFolder;
|
||||||
private readonly IEnumerable<IExtensionLoader> _loaders;
|
private readonly IEnumerable<IExtensionLoader> _loaders;
|
||||||
|
private readonly IAssemblyLoader _assemblyLoader;
|
||||||
|
|
||||||
public DefaultExtensionCompiler(
|
public DefaultExtensionCompiler(
|
||||||
IVirtualPathProvider virtualPathProvider,
|
IVirtualPathProvider virtualPathProvider,
|
||||||
IProjectFileParser projectFileParser,
|
IProjectFileParser projectFileParser,
|
||||||
IDependenciesFolder dependenciesFolder,
|
IDependenciesFolder dependenciesFolder,
|
||||||
IEnumerable<IExtensionLoader> loaders) {
|
IEnumerable<IExtensionLoader> loaders,
|
||||||
|
IAssemblyLoader assemblyLoader) {
|
||||||
|
|
||||||
_virtualPathProvider = virtualPathProvider;
|
_virtualPathProvider = virtualPathProvider;
|
||||||
_projectFileParser = projectFileParser;
|
_projectFileParser = projectFileParser;
|
||||||
_dependenciesFolder = dependenciesFolder;
|
_dependenciesFolder = dependenciesFolder;
|
||||||
_loaders = loaders;
|
_loaders = loaders;
|
||||||
|
_assemblyLoader = assemblyLoader;
|
||||||
|
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
Logger = NullLogger.Instance;
|
Logger = NullLogger.Instance;
|
||||||
@@ -55,13 +59,30 @@ namespace Orchard.Environment.Extensions.Compilers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add assembly references
|
// Add assembly references
|
||||||
|
var addedReferences = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
foreach (var reference in dependencyDescriptor.References) {
|
foreach (var reference in dependencyDescriptor.References) {
|
||||||
var referenceTemp = reference;
|
var referenceTemp = reference;
|
||||||
var loader = _loaders.SingleOrDefault(l => l.Name == referenceTemp.LoaderName);
|
var loader = _loaders.SingleOrDefault(l => l.Name == referenceTemp.LoaderName);
|
||||||
if (loader != null) {
|
if (loader != null) {
|
||||||
var assembly = loader.LoadReference(reference);
|
var assembly = loader.LoadReference(reference);
|
||||||
if (assembly != null)
|
if (assembly != null) {
|
||||||
context.AssemblyBuilder.AddAssemblyReference(assembly);
|
context.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||||
|
addedReferences.Add(reference.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load references specified in project file
|
||||||
|
foreach (var assemblyReference in descriptor.References) {
|
||||||
|
if (!addedReferences.Contains(assemblyReference.AssemblyName)) {
|
||||||
|
var assembly = _assemblyLoader.Load(assemblyReference.AssemblyName);
|
||||||
|
if (assembly != null) {
|
||||||
|
context.AssemblyBuilder.AddAssemblyReference(assembly);
|
||||||
|
addedReferences.Add(assemblyReference.AssemblyName);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Logger.Warning("Assembly reference '{0}' for project '{1}' skipped due to load error", assemblyReference.AssemblyName, context.VirtualPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
27
src/Orchard/Environment/IAssemblyLoader.cs
Normal file
27
src/Orchard/Environment/IAssemblyLoader.cs
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
using Orchard.Logging;
|
||||||
|
|
||||||
|
namespace Orchard.Environment {
|
||||||
|
public interface IAssemblyLoader {
|
||||||
|
Assembly Load(string assemblyName);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DefaultAssemblyLoader : IAssemblyLoader {
|
||||||
|
public DefaultAssemblyLoader() {
|
||||||
|
Logger = NullLogger.Instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILogger Logger { get; set; }
|
||||||
|
|
||||||
|
public Assembly Load(string assemblyName) {
|
||||||
|
try {
|
||||||
|
return Assembly.Load(assemblyName);
|
||||||
|
}
|
||||||
|
catch (Exception e) {
|
||||||
|
Logger.Warning(e, "Error loading assembly '{0}'", assemblyName);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -44,6 +44,7 @@ namespace Orchard.Environment {
|
|||||||
builder.RegisterType<AppDataFolderRoot>().As<IAppDataFolderRoot>().SingleInstance();
|
builder.RegisterType<AppDataFolderRoot>().As<IAppDataFolderRoot>().SingleInstance();
|
||||||
builder.RegisterType<DefaultExtensionCompiler>().As<IExtensionCompiler>().SingleInstance();
|
builder.RegisterType<DefaultExtensionCompiler>().As<IExtensionCompiler>().SingleInstance();
|
||||||
builder.RegisterType<DefaultProjectFileParser>().As<IProjectFileParser>().SingleInstance();
|
builder.RegisterType<DefaultProjectFileParser>().As<IProjectFileParser>().SingleInstance();
|
||||||
|
builder.RegisterType<DefaultAssemblyLoader>().As<IAssemblyLoader>().SingleInstance();
|
||||||
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
|
builder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
|
||||||
|
|
||||||
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
RegisterVolatileProvider<WebSiteFolder, IWebSiteFolder>(builder);
|
||||||
|
@@ -175,6 +175,7 @@
|
|||||||
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
|
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
|
||||||
<Compile Include="Environment\Extensions\Loaders\RawThemeExtensionLoader.cs" />
|
<Compile Include="Environment\Extensions\Loaders\RawThemeExtensionLoader.cs" />
|
||||||
<Compile Include="Environment\Features\FeatureManager.cs" />
|
<Compile Include="Environment\Features\FeatureManager.cs" />
|
||||||
|
<Compile Include="Environment\IAssemblyLoader.cs" />
|
||||||
<Compile Include="Localization\Services\DefaultLocalizedStringManager.cs" />
|
<Compile Include="Localization\Services\DefaultLocalizedStringManager.cs" />
|
||||||
<Compile Include="Localization\Services\ILocalizedStringManager.cs" />
|
<Compile Include="Localization\Services\ILocalizedStringManager.cs" />
|
||||||
<Compile Include="Mvc\IOrchardViewPage.cs" />
|
<Compile Include="Mvc\IOrchardViewPage.cs" />
|
||||||
|
Reference in New Issue
Block a user