Browse Source

Replace virtual file system by physical file system on development.

pull/179/head
Halil İbrahim Kalkan 9 years ago
parent
commit
99de9b367f
  1. 8
      src/AbpDesk/AbpDesk.MongoBlog/AbpDesk/Blogging/AbpDeskMongoBlogModule.cs
  2. 16
      src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs
  3. BIN
      src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll
  4. 11
      src/Volo.Abp.Account.Web/AbpAccountWebModule.cs
  5. 31
      src/Volo.Abp.AspNetCore.EmbeddedFiles/Microsoft/AspNetCore/Builder/VirtualFileSystemApplicationBuilderExtensions.cs
  6. 2
      src/Volo.Abp.AspNetCore.EmbeddedFiles/Volo.Abp.AspNetCore.EmbeddedFiles.csproj
  7. 9
      src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/AbpAspNetCoreMvcUiBootstrapModule.cs
  8. 9
      src/Volo.Abp.AspNetCore.Mvc.UI/AbpAspNetCoreMvcUiModule.cs
  9. 4
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
  10. 14
      src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/VirtualFileSystem/AspNetCoreVirtualViewFileProvider.cs
  11. 2
      src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj
  12. 18
      src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/AspNetCoreVirtualFileOptions.cs
  13. 41
      src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/AspNetCoreVirtualFileProvider.cs
  14. 8
      src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs
  15. 2
      src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj
  16. 8
      src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs
  17. 1
      src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileProvider.cs
  18. 14
      src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs
  19. 44
      src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs
  20. 8
      src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSystemOptions.cs
  21. 9
      test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/EmbeddedFileManager_Tests.cs

8
src/AbpDesk/AbpDesk.MongoBlog/AbpDesk/Blogging/AbpDeskMongoBlogModule.cs

@ -9,7 +9,6 @@ using Volo.Abp.Modularity;
using Volo.Abp.MongoDB;
using Volo.Abp.Uow;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp.VirtualFileSystem.Embedded;
namespace AbpDesk.Blogging
{
@ -26,12 +25,7 @@ namespace AbpDesk.Blogging
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.Add(
new EmbeddedFileSet(
GetType().Assembly,
"" //TODO: This is not tested yet!
)
);
options.FileSets.AddEmbedded<AbpDeskMongoBlogModule>(); //TODO: Test empty base namespace!
});
services.AddAssemblyOf<AbpDeskMongoBlogModule>();

16
src/AbpDesk/AbpDesk.Web.Mvc/AbpDeskWebMvcModule.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using AbpDesk.EntityFrameworkCore;
using AbpDesk.Web.Mvc.Navigation;
using Microsoft.AspNetCore.Builder;
@ -21,6 +22,7 @@ using Volo.Abp.Identity.EntityFrameworkCore;
using Volo.Abp.Identity.Web;
using Volo.Abp.Modularity;
using Volo.Abp.Ui.Navigation;
using Volo.Abp.VirtualFileSystem;
namespace AbpDesk.Web.Mvc
{
@ -73,6 +75,20 @@ namespace AbpDesk.Web.Mvc
{
options.ConventionalControllers.Create(typeof(AbpDeskApplicationModule).Assembly);
});
var env = services.GetSingletonInstance<IHostingEnvironment>(); //TODO: Find a better way!
if (env.IsDevelopment())
{
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.ReplaceEmbeddedByPyhsical<AbpAspNetCoreMvcUiModule>(Path.Combine(env.ContentRootPath, "..\\..\\Volo.Abp.AspNetCore.Mvc.UI"));
options.FileSets.ReplaceEmbeddedByPyhsical<AbpAspNetCoreMvcUiBootstrapModule>(Path.Combine(env.ContentRootPath, "..\\..\\Volo.Abp.AspNetCore.Mvc.UI.Bootstrap"));
options.FileSets.ReplaceEmbeddedByPyhsical<AbpAccountWebModule>(Path.Combine(env.ContentRootPath, "..\\..\\Volo.Abp.Account.Web"));
options.FileSets.ReplaceEmbeddedByPyhsical<AbpIdentityWebModule>(Path.Combine(env.ContentRootPath, "..\\..\\Volo.Abp.Identity.Web"));
});
}
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)

BIN
src/AbpDesk/Web_PlugIns/AbpDesk.MongoBlog.dll

Binary file not shown.

11
src/Volo.Abp.Account.Web/AbpAccountWebModule.cs

@ -1,10 +1,8 @@
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
using Volo.Abp.Identity;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp.VirtualFileSystem.Embedded;
namespace Volo.Abp.Account.Web
{
@ -19,12 +17,7 @@ namespace Volo.Abp.Account.Web
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.Add(
new EmbeddedFileSet(
GetType().Assembly,
"Volo.Abp.Account.Web"
)
);
options.FileSets.AddEmbedded<AbpAccountWebModule>("Volo.Abp.Account.Web");
});
}
}

31
src/Volo.Abp.AspNetCore.EmbeddedFiles/Microsoft/AspNetCore/Builder/VirtualFileSystemApplicationBuilderExtensions.cs

@ -1,4 +1,9 @@
using Volo.Abp.AspNetCore.VirtualFileSystem;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Options;
using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.VirtualFileSystem;
namespace Microsoft.AspNetCore.Builder
{
@ -6,13 +11,29 @@ namespace Microsoft.AspNetCore.Builder
{
public static void UseVirtualFiles(this IApplicationBuilder app)
{
var options = app.ApplicationServices.GetRequiredService<IOptions<VirtualFileSystemOptions>>().Value;
IFileProvider fileProvider = new AspNetCoreVirtualFileProvider(
app.ApplicationServices,
"/wwwroot"
);
if (options.FileSets.PhysicalPaths.Any())
{
var fileProviders = options.FileSets.PhysicalPaths
.Select(p => new PhysicalFileProvider(p))
.Cast<IFileProvider>()
.ToList();
fileProviders.Add(fileProvider);
fileProvider = new CompositeFileProvider(fileProviders);
}
app.UseStaticFiles(
new StaticFileOptions
{
FileProvider = new AspNetCoreVirtualFileProvider(
app.ApplicationServices,
"/wwwroot"
)
FileProvider = fileProvider
}
);
}

2
src/Volo.Abp.AspNetCore.EmbeddedFiles/Volo.Abp.AspNetCore.EmbeddedFiles.csproj

@ -19,6 +19,8 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" />
</ItemGroup>
</Project>

9
src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/AbpAspNetCoreMvcUiBootstrapModule.cs

@ -1,10 +1,8 @@
using System;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Bundling;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp.VirtualFileSystem.Embedded;
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
{
@ -17,12 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.Add(
new EmbeddedFileSet(
GetType().Assembly,
"Volo.Abp.AspNetCore.Mvc.UI.Bootstrap"
)
);
options.FileSets.AddEmbedded<AbpAspNetCoreMvcUiBootstrapModule>("Volo.Abp.AspNetCore.Mvc.UI.Bootstrap");
});
services.Configure<BundlingOptions>(options =>

9
src/Volo.Abp.AspNetCore.Mvc.UI/AbpAspNetCoreMvcUiModule.cs

@ -1,10 +1,8 @@
using System;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Bundling;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp.VirtualFileSystem.Embedded;
namespace Volo.Abp.AspNetCore.Mvc
{
@ -17,12 +15,7 @@ namespace Volo.Abp.AspNetCore.Mvc
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.Add(
new EmbeddedFileSet(
GetType().Assembly,
"Volo.Abp.AspNetCore.Mvc"
)
);
options.FileSets.AddEmbedded<AbpAspNetCoreMvcUiModule>("Volo.Abp.AspNetCore.Mvc");
});
services.Configure<BundlingOptions>(options =>

4
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs

@ -17,7 +17,7 @@ using Microsoft.AspNetCore.Mvc.ViewComponents;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Volo.Abp.AspNetCore.Mvc.Conventions;
using Volo.Abp.AspNetCore.Mvc.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.VirtualFileSystem;
using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.Http;
using Volo.Abp.Http.Modeling;
@ -40,7 +40,7 @@ namespace Volo.Abp.AspNetCore.Mvc
new ConfigureOptions<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(
new AspNetCoreVirtualViewFileProvider(
new AspNetCoreVirtualFileProvider(
services.GetSingletonInstance<IObjectAccessor<IServiceProvider>>()
)
);

14
src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/VirtualFileSystem/AspNetCoreVirtualViewFileProvider.cs

@ -1,14 +0,0 @@
using System;
using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.AspNetCore.Mvc.VirtualFileSystem
{
public class AspNetCoreVirtualViewFileProvider : AspNetCoreVirtualFileProvider
{
public AspNetCoreVirtualViewFileProvider(IObjectAccessor<IServiceProvider> serviceProviderAccessor)
: base(serviceProviderAccessor)
{
}
}
}

2
src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj

@ -18,6 +18,8 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Composite" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Routing.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.0.0" />

18
src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/AspNetCoreVirtualFileOptions.cs

@ -1,18 +0,0 @@
using System.Collections.Generic;
namespace Volo.Abp.AspNetCore.VirtualFileSystem
{
internal class AspNetCoreVirtualFileOptions //TODO: and use this!
{
public HashSet<string> IgnoredFileExtensions { get; }
public AspNetCoreVirtualFileOptions()
{
IgnoredFileExtensions = new HashSet<string>
{
".cshtml",
".config"
};
}
}
}

41
src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/VirtualFileSystem/AspNetCoreVirtualFileProvider.cs

@ -1,5 +1,5 @@
using System;
using System.IO;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Options;
@ -11,8 +11,7 @@ namespace Volo.Abp.AspNetCore.VirtualFileSystem
{
public class AspNetCoreVirtualFileProvider : IFileProvider
{
private readonly Lazy<IVirtualFileProvider> _virtualFileProvider;
private readonly Lazy<AspNetCoreVirtualFileOptions> _options;
private readonly Lazy<IFileProvider> _fileProvider;
private readonly IObjectAccessor<IServiceProvider> _serviceProviderAccessor;
private readonly string _contentPath;
@ -26,13 +25,27 @@ namespace Volo.Abp.AspNetCore.VirtualFileSystem
{
_serviceProviderAccessor = serviceProviderAccessor;
_virtualFileProvider = new Lazy<IVirtualFileProvider>(
() => serviceProviderAccessor.Value.GetRequiredService<IVirtualFileProvider>(),
true
);
_fileProvider = new Lazy<IFileProvider>(
() =>
{
var options = serviceProviderAccessor.Value.GetRequiredService<IOptions<VirtualFileSystemOptions>>().Value;
IFileProvider fileProvider = serviceProviderAccessor.Value.GetRequiredService<IVirtualFileProvider>();
if (options.FileSets.PhysicalPaths.Any())
{
var fileProviders = options.FileSets.PhysicalPaths
.Select(p => new PhysicalFileProvider(p))
.Cast<IFileProvider>()
.ToList();
_options = new Lazy<AspNetCoreVirtualFileOptions>(
() => serviceProviderAccessor.Value.GetRequiredService<IOptions<AspNetCoreVirtualFileOptions>>().Value,
fileProviders.Add(fileProvider);
fileProvider = new CompositeFileProvider(fileProviders);
}
return fileProvider;
},
true
);
}
@ -44,14 +57,12 @@ namespace Volo.Abp.AspNetCore.VirtualFileSystem
subpath = _contentPath + subpath;
}
//TODO: Ignore files in _options.Value.IgnoredFileExtensions
if (!IsInitialized())
{
return new NotFoundFileInfo(subpath);
}
return _virtualFileProvider.Value.GetFileInfo(subpath);
return _fileProvider.Value.GetFileInfo(subpath);
}
public IDirectoryContents GetDirectoryContents(string subpath)
@ -61,14 +72,12 @@ namespace Volo.Abp.AspNetCore.VirtualFileSystem
subpath = _contentPath + subpath;
}
//TODO: Ignore files in _options.Value.IgnoredFileExtensions
if (!IsInitialized())
{
return new NotFoundDirectoryContents();
}
return _virtualFileProvider.Value.GetDirectoryContents(subpath);
return _fileProvider.Value.GetDirectoryContents(subpath);
}
public IChangeToken Watch(string filter)
@ -78,7 +87,7 @@ namespace Volo.Abp.AspNetCore.VirtualFileSystem
return NullChangeToken.Singleton;
}
return _virtualFileProvider.Value.Watch(filter);
return _fileProvider.Value.Watch(filter);
}
private bool IsInitialized()

8
src/Volo.Abp.Identity.Web/AbpIdentityWebModule.cs

@ -6,7 +6,6 @@ using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Ui.Navigation;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp.VirtualFileSystem.Embedded;
namespace Volo.Abp.Identity.Web
{
@ -25,12 +24,7 @@ namespace Volo.Abp.Identity.Web
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.Add(
new EmbeddedFileSet(
GetType().Assembly,
"Volo.Abp.Identity.Web"
)
);
options.FileSets.AddEmbedded<AbpIdentityWebModule>("Volo.Abp.Identity.Web");
});
services.Configure<AbpLocalizationOptions>(options =>

2
src/Volo.Abp.VirtualFileSystem/Volo.Abp.VirtualFileSystem.csproj

@ -14,7 +14,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Abstractions" Version="2.0.0" />
<PackageReference Include="Microsoft.Extensions.FileProviders.Physical" Version="2.0.0" />
</ItemGroup>
<ItemGroup>

8
src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/Embedded/EmbeddedFileSet.cs

@ -16,12 +16,16 @@ namespace Volo.Abp.VirtualFileSystem.Embedded
[CanBeNull]
public string BaseNamespace { get; }
public EmbeddedFileSet([NotNull] Assembly assembly, string baseNamespace)
[CanBeNull]
public string BaseFolderInProject { get; }
public EmbeddedFileSet([NotNull] Assembly assembly, [CanBeNull] string baseNamespace, [CanBeNull] string baseFolderInProject = null)
{
Check.NotNull(assembly, nameof(assembly));
Assembly = assembly;
BaseNamespace = baseNamespace;
BaseFolderInProject = baseFolderInProject;
}
public void AddFiles(Dictionary<string, IFileInfo> files)
@ -52,7 +56,7 @@ namespace Volo.Abp.VirtualFileSystem.Embedded
}
}
private void AddDirectoriesRecursively(Dictionary<string, IFileInfo> files, string directoryPath, DateTimeOffset lastModificationTime)
private static void AddDirectoriesRecursively(Dictionary<string, IFileInfo> files, string directoryPath, DateTimeOffset lastModificationTime)
{
if (files.ContainsKey(directoryPath))
{

1
src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/IVirtualFileProvider.cs

@ -4,5 +4,6 @@ namespace Volo.Abp.VirtualFileSystem
{
public interface IVirtualFileProvider : IFileProvider
{
}
}

14
src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetList.cs

@ -0,0 +1,14 @@
using System.Collections.Generic;
namespace Volo.Abp.VirtualFileSystem
{
public class VirtualFileSetList : List<IVirtualFileSet>
{
public List<string> PhysicalPaths { get; }
public VirtualFileSetList()
{
PhysicalPaths = new List<string>();
}
}
}

44
src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSetListExtensions.cs

@ -0,0 +1,44 @@
using System;
using System.IO;
using System.Linq;
using JetBrains.Annotations;
using Volo.Abp.VirtualFileSystem.Embedded;
namespace Volo.Abp.VirtualFileSystem
{
public static class VirtualFileSetListExtensions
{
public static void AddEmbedded<T>([NotNull] this VirtualFileSetList list, [CanBeNull] string baseNamespace = null)
{
Check.NotNull(list, nameof(list));
list.Add(
new EmbeddedFileSet(
typeof(T).Assembly,
baseNamespace
)
);
}
public static void ReplaceEmbeddedByPyhsical<T>([NotNull] this VirtualFileSetList list, [NotNull] string pyhsicalPath)
{
Check.NotNull(list, nameof(list));
Check.NotNull(pyhsicalPath, nameof(pyhsicalPath));
var assembly = typeof(T).Assembly;
var embeddedFileSets = list.OfType<EmbeddedFileSet>().Where(fs => fs.Assembly == assembly).ToList();
foreach (var embeddedFileSet in embeddedFileSets)
{
list.Remove(embeddedFileSet);
if (!embeddedFileSet.BaseFolderInProject.IsNullOrEmpty())
{
pyhsicalPath = Path.Combine(pyhsicalPath, embeddedFileSet.BaseFolderInProject);
}
list.PhysicalPaths.Add(pyhsicalPath);
}
}
}
}

8
src/Volo.Abp.VirtualFileSystem/Volo/Abp/VirtualFileSystem/VirtualFileSystemOptions.cs

@ -1,14 +1,12 @@
using System.Collections.Generic;
namespace Volo.Abp.VirtualFileSystem
namespace Volo.Abp.VirtualFileSystem
{
public class VirtualFileSystemOptions
{
public List<IVirtualFileSet> FileSets { get; }
public VirtualFileSetList FileSets { get; }
public VirtualFileSystemOptions()
{
FileSets = new List<IVirtualFileSet>();
FileSets = new VirtualFileSetList();
}
}
}

9
test/Volo.Abp.VirtualFileSystem.Tests/Volo/Abp/VirtualFileSystem/EmbeddedFileManager_Tests.cs

@ -1,11 +1,9 @@
using System.IO;
using System.Reflection;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Modularity;
using Volo.Abp.TestBase;
using Volo.Abp.VirtualFileSystem.Embedded;
using Xunit;
namespace Volo.Abp.VirtualFileSystem
@ -42,12 +40,7 @@ namespace Volo.Abp.VirtualFileSystem
{
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.Add(
new EmbeddedFileSet(
GetType().Assembly,
"Volo.Abp.VirtualFileSystem.MyResources"
)
);
options.FileSets.AddEmbedded<TestModule>("Volo.Abp.VirtualFileSystem.MyResources");
});
}
}

Loading…
Cancel
Save