mirror of https://github.com/abpframework/abp.git
53 changed files with 1476 additions and 1 deletions
@ -0,0 +1,49 @@ |
|||||
|
|
||||
|
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||
|
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{344A1096-CC05-42D1-BDDB-E254C27508A9}" |
||||
|
EndProject |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Studio.Analyzing.Abstractions", "src\Volo.Abp.Studio.Analyzing.Abstractions\Volo.Abp.Studio.Analyzing.Abstractions.csproj", "{2271296E-33FD-46BE-97FD-9938193CB7D1}" |
||||
|
EndProject |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Studio.Domain.CommonServices", "src\Volo.Abp.Studio.Domain.CommonServices\Volo.Abp.Studio.Domain.CommonServices.csproj", "{1C86021F-E522-41A1-AC3F-01B0E474D75E}" |
||||
|
EndProject |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Studio.Domain.Shared", "src\Volo.Abp.Studio.Domain.Shared\Volo.Abp.Studio.Domain.Shared.csproj", "{28132E4E-FFB9-45C4-99AD-1BCA04B3E597}" |
||||
|
EndProject |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Studio.ModuleInstaller", "src\Volo.Abp.Studio.ModuleInstaller\Volo.Abp.Studio.ModuleInstaller.csproj", "{4FA11334-D727-4C14-9D71-1DB46AC3BE9C}" |
||||
|
EndProject |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Studio.ModuleInstaller.Abstractions", "src\Volo.Abp.Studio.ModuleInstaller.Abstractions\Volo.Abp.Studio.ModuleInstaller.Abstractions.csproj", "{99679BF9-B888-4814-8E85-F751984CAFF8}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{2271296E-33FD-46BE-97FD-9938193CB7D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{2271296E-33FD-46BE-97FD-9938193CB7D1}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{2271296E-33FD-46BE-97FD-9938193CB7D1}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{2271296E-33FD-46BE-97FD-9938193CB7D1}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{1C86021F-E522-41A1-AC3F-01B0E474D75E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{1C86021F-E522-41A1-AC3F-01B0E474D75E}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{1C86021F-E522-41A1-AC3F-01B0E474D75E}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{1C86021F-E522-41A1-AC3F-01B0E474D75E}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{28132E4E-FFB9-45C4-99AD-1BCA04B3E597}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{28132E4E-FFB9-45C4-99AD-1BCA04B3E597}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{28132E4E-FFB9-45C4-99AD-1BCA04B3E597}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{28132E4E-FFB9-45C4-99AD-1BCA04B3E597}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{4FA11334-D727-4C14-9D71-1DB46AC3BE9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{4FA11334-D727-4C14-9D71-1DB46AC3BE9C}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{4FA11334-D727-4C14-9D71-1DB46AC3BE9C}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{4FA11334-D727-4C14-9D71-1DB46AC3BE9C}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{99679BF9-B888-4814-8E85-F751984CAFF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{99679BF9-B888-4814-8E85-F751984CAFF8}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{99679BF9-B888-4814-8E85-F751984CAFF8}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{99679BF9-B888-4814-8E85-F751984CAFF8}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(NestedProjects) = preSolution |
||||
|
{2271296E-33FD-46BE-97FD-9938193CB7D1} = {344A1096-CC05-42D1-BDDB-E254C27508A9} |
||||
|
{1C86021F-E522-41A1-AC3F-01B0E474D75E} = {344A1096-CC05-42D1-BDDB-E254C27508A9} |
||||
|
{28132E4E-FFB9-45C4-99AD-1BCA04B3E597} = {344A1096-CC05-42D1-BDDB-E254C27508A9} |
||||
|
{4FA11334-D727-4C14-9D71-1DB46AC3BE9C} = {344A1096-CC05-42D1-BDDB-E254C27508A9} |
||||
|
{99679BF9-B888-4814-8E85-F751984CAFF8} = {344A1096-CC05-42D1-BDDB-E254C27508A9} |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,12 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.Core\Volo.Abp.Core.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,9 @@ |
|||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing |
||||
|
{ |
||||
|
public class AbpStudioAnalyzingAbstractionsModule : AbpModule |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Application |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class ApplicationServiceModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "applicationService"; |
||||
|
|
||||
|
public string Namespace { get; set; } |
||||
|
|
||||
|
public string Summary { get; set; } |
||||
|
|
||||
|
public List<string> ImplementingInterfaces { get; set; } |
||||
|
|
||||
|
public ApplicationServiceModel([NotNull] string name) : base(name) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,24 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Authorization |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class PermissionModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "permission"; |
||||
|
|
||||
|
public string DisplayName { get; } |
||||
|
|
||||
|
public bool IsEnabled { get; } |
||||
|
|
||||
|
public PermissionModel( |
||||
|
[NotNull] string name, |
||||
|
string displayName, |
||||
|
bool isEnabled) |
||||
|
: base(name) |
||||
|
{ |
||||
|
DisplayName = displayName; |
||||
|
IsEnabled = isEnabled; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Database |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class DatabaseCollectionModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "databaseCollection"; |
||||
|
|
||||
|
public string EntityFullName { get; private set; } |
||||
|
|
||||
|
public DatabaseCollectionModel([NotNull] string name, string entityFullName) : base(name) |
||||
|
{ |
||||
|
EntityFullName = Check.NotNullOrWhiteSpace(entityFullName, nameof(entityFullName)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Database |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class DatabaseTableModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "databaseTable"; |
||||
|
|
||||
|
public string EntityFullName { get; private set; } |
||||
|
|
||||
|
public DatabaseTableModel([NotNull] string name, string entityFullName) : base(name) |
||||
|
{ |
||||
|
EntityFullName = Check.NotNullOrWhiteSpace(entityFullName, nameof(entityFullName)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Database |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class EfCoreDbContextModel : PackageContentItemModel, IDbContextModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "efCoreDbContext"; |
||||
|
|
||||
|
public string Namespace { get; private set; } |
||||
|
|
||||
|
public string ConnectionStringName { get; set; } |
||||
|
|
||||
|
public List<DatabaseTableModel> DatabaseTables { get; set; } |
||||
|
|
||||
|
public EfCoreDbContextModel( |
||||
|
[NotNull] string name, |
||||
|
[NotNull] string @namespace |
||||
|
) : base(name) |
||||
|
{ |
||||
|
Namespace = Check.NotNullOrWhiteSpace(@namespace, nameof(@namespace)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Database |
||||
|
{ |
||||
|
public interface IDbContextModel |
||||
|
{ |
||||
|
string ConnectionStringName { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Database |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class MongoDbContextModel : PackageContentItemModel, IDbContextModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "mongoDbContext"; |
||||
|
|
||||
|
public string Namespace { get; private set; } |
||||
|
|
||||
|
public string ConnectionStringName { get; set; } |
||||
|
|
||||
|
public List<DatabaseCollectionModel> DatabaseCollections { get; set; } |
||||
|
|
||||
|
public MongoDbContextModel( |
||||
|
[NotNull] string name, |
||||
|
[NotNull] string @namespace |
||||
|
) : base(name) |
||||
|
{ |
||||
|
Namespace = Check.NotNullOrWhiteSpace(@namespace, nameof(@namespace)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Domain |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class AggregateRootModel : EntityModel |
||||
|
{ |
||||
|
public new const string ContentTypeName = "aggregateRoot"; |
||||
|
|
||||
|
public AggregateRootModel(string name) : base(name) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Domain |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class DomainServiceModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "domainService"; |
||||
|
|
||||
|
public string Namespace { get; set; } |
||||
|
|
||||
|
public string Summary { get; set; } |
||||
|
|
||||
|
public DomainServiceModel([NotNull] string name) : base(name) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,25 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Domain |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class EntityModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "entity"; |
||||
|
|
||||
|
public string Namespace { get; set; } |
||||
|
|
||||
|
public string PrimaryKeyType { get; set; } |
||||
|
|
||||
|
public string Summary { get; set; } |
||||
|
|
||||
|
public List<string> CollectionProperties { get; set; } |
||||
|
public List<string> NavigationProperties { get; set; } |
||||
|
|
||||
|
public EntityModel(string name) : base(name) |
||||
|
{ |
||||
|
CollectionProperties = new List<string>(); |
||||
|
NavigationProperties = new List<string>(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Domain |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class RepositoryInterfaceModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "repositoryInterface"; |
||||
|
|
||||
|
public string Namespace { get; set; } |
||||
|
|
||||
|
public string Summary { get; set; } |
||||
|
|
||||
|
public EntityModel EntityModel { get; set; } |
||||
|
|
||||
|
public RepositoryInterfaceModel([NotNull] string name) : base(name) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,40 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Feature |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class FeatureModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "feature"; |
||||
|
|
||||
|
public string ValueType { get; } |
||||
|
|
||||
|
public string DefaultValue { get; } |
||||
|
|
||||
|
public string DisplayName { get; } |
||||
|
|
||||
|
public string Description { get; } |
||||
|
|
||||
|
public bool IsAvailableToHost { get; } |
||||
|
|
||||
|
public bool IsVisibleToClients { get; } |
||||
|
|
||||
|
public FeatureModel( |
||||
|
[NotNull] string name, |
||||
|
[NotNull] string valueType, |
||||
|
string defaultValue, |
||||
|
string displayName, |
||||
|
string description, |
||||
|
bool isAvailableToHost, |
||||
|
bool isVisibleToClients |
||||
|
) : base(name) |
||||
|
{ |
||||
|
ValueType = valueType; |
||||
|
DefaultValue = defaultValue; |
||||
|
DisplayName = displayName; |
||||
|
Description = description; |
||||
|
IsAvailableToHost = isAvailableToHost; |
||||
|
IsVisibleToClients = isVisibleToClients; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Module |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class AbpModuleModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "abpModule"; |
||||
|
|
||||
|
public string Namespace { get; set; } |
||||
|
|
||||
|
public AbpModuleModel([NotNull] string name) : base(name) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models |
||||
|
{ |
||||
|
public abstract class PackageContentItemModel |
||||
|
{ |
||||
|
public string ContentType { get; } |
||||
|
public string Name { get; } |
||||
|
|
||||
|
public PackageContentItemModel([NotNull] string name) |
||||
|
{ |
||||
|
Name = Check.NotNullOrWhiteSpace(name, nameof(name)); |
||||
|
ContentType = PackageContentItemNameAttribute.GetName(GetType()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Reflection; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models |
||||
|
{ |
||||
|
public class PackageContentItemNameAttribute : Attribute |
||||
|
{ |
||||
|
public string Name { get; } |
||||
|
|
||||
|
public PackageContentItemNameAttribute(string name) |
||||
|
{ |
||||
|
Name = name; |
||||
|
} |
||||
|
|
||||
|
public static string GetName(Type type) |
||||
|
{ |
||||
|
var attribute = ReflectionHelper.GetSingleAttributeOrDefault<PackageContentItemNameAttribute>(type); |
||||
|
if (attribute == null) |
||||
|
{ |
||||
|
throw new ApplicationException($"Given type {type.FullName} must have an {nameof(PackageContentItemNameAttribute)}, but not defined!"); |
||||
|
} |
||||
|
|
||||
|
return attribute.Name; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models |
||||
|
{ |
||||
|
public class PackageContentList : List<PackageContentItemModel> |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models |
||||
|
{ |
||||
|
public class PackageModel |
||||
|
{ |
||||
|
public string Name { get; } |
||||
|
|
||||
|
public string Hash { get; } |
||||
|
|
||||
|
public PackageContentList Contents { get; } |
||||
|
|
||||
|
public PackageModel([NotNull] string name, [NotNull] string hash) |
||||
|
{ |
||||
|
Name = Check.NotNullOrWhiteSpace(name, nameof(name)); |
||||
|
Contents = new PackageContentList(); |
||||
|
Hash = hash; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing.Models.Setting |
||||
|
{ |
||||
|
[PackageContentItemName(ContentTypeName)] |
||||
|
public class SettingModel : PackageContentItemModel |
||||
|
{ |
||||
|
public const string ContentTypeName = "setting"; |
||||
|
|
||||
|
public string DefaultValue { get; set; } |
||||
|
|
||||
|
public string DisplayName { get; set; } |
||||
|
|
||||
|
public string Description { get; set; } |
||||
|
|
||||
|
public bool IsVisibleToClient { get; set; } |
||||
|
|
||||
|
public bool IsInherited { get; set; } |
||||
|
|
||||
|
public bool IsEncrypted { get; set; } |
||||
|
|
||||
|
public SettingModel([NotNull] string name) : base(name) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\..\..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>net5.0</TargetFramework> |
||||
|
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> |
||||
|
<PackageReference Include="System.IO.Abstractions" Version="13.2.28" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\Volo.Abp.Studio.Domain.Shared\Volo.Abp.Studio.Domain.Shared.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,17 @@ |
|||||
|
using System.IO.Abstractions; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.Studio |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpStudioDomainSharedModule) |
||||
|
)] |
||||
|
public class AbpStudioDomainCommonServicesModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddSingleton<IFileSystem>(new FileSystem()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
using System; |
||||
|
using System.Runtime.Serialization; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
|
||||
|
namespace Volo.Abp.Studio |
||||
|
{ |
||||
|
public class AbpStudioException : BusinessException |
||||
|
{ |
||||
|
public AbpStudioException( |
||||
|
string code = null, |
||||
|
string message = null, |
||||
|
string details = null, |
||||
|
Exception innerException = null, |
||||
|
LogLevel logLevel = LogLevel.Warning) |
||||
|
: base(code, message, details, innerException, logLevel) |
||||
|
{ |
||||
|
Code = code; |
||||
|
Details = details; |
||||
|
LogLevel = logLevel; |
||||
|
} |
||||
|
|
||||
|
public AbpStudioException(SerializationInfo serializationInfo, StreamingContext context) |
||||
|
: base(serializationInfo, context) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,103 @@ |
|||||
|
using System.Diagnostics; |
||||
|
using System.IO; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Helpers |
||||
|
{ |
||||
|
//todo: move this to volo.abp.cli.core!
|
||||
|
public class CmdHelper : ICmdHelper, ITransientDependency |
||||
|
{ |
||||
|
public void RunCmd(string command, string workingDirectory = null) |
||||
|
{ |
||||
|
var procStartInfo = new ProcessStartInfo( |
||||
|
GetFileName(), |
||||
|
GetArguments(command) |
||||
|
); |
||||
|
|
||||
|
if (!string.IsNullOrEmpty(workingDirectory)) |
||||
|
{ |
||||
|
procStartInfo.WorkingDirectory = workingDirectory; |
||||
|
} |
||||
|
|
||||
|
using (var process = Process.Start(procStartInfo)) |
||||
|
{ |
||||
|
process?.WaitForExit(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public string RunCmdAndGetOutput(string command, string workingDirectory = null) |
||||
|
{ |
||||
|
string output; |
||||
|
|
||||
|
using (var process = new Process()) |
||||
|
{ |
||||
|
process.StartInfo = new ProcessStartInfo(GetFileName()) |
||||
|
{ |
||||
|
Arguments = GetArguments(command), |
||||
|
UseShellExecute = false, |
||||
|
CreateNoWindow = true, |
||||
|
RedirectStandardOutput = true, |
||||
|
RedirectStandardError = true |
||||
|
}; |
||||
|
|
||||
|
if (!string.IsNullOrEmpty(workingDirectory)) |
||||
|
{ |
||||
|
process.StartInfo.WorkingDirectory = workingDirectory; |
||||
|
} |
||||
|
|
||||
|
process.Start(); |
||||
|
|
||||
|
using (var standardOutput = process.StandardOutput) |
||||
|
{ |
||||
|
using (var standardError = process.StandardError) |
||||
|
{ |
||||
|
output = standardOutput.ReadToEnd(); |
||||
|
output += standardError.ReadToEnd(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
process.WaitForExit(); |
||||
|
} |
||||
|
|
||||
|
return output.Trim(); |
||||
|
} |
||||
|
|
||||
|
private string GetArguments(string command) |
||||
|
{ |
||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) |
||||
|
{ |
||||
|
return "-c \"" + command + "\""; |
||||
|
} |
||||
|
|
||||
|
//Windows default.
|
||||
|
return "/C \"" + command + "\""; |
||||
|
} |
||||
|
|
||||
|
private string GetFileName() |
||||
|
{ |
||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
||||
|
{ |
||||
|
//Windows
|
||||
|
return "cmd.exe"; |
||||
|
} |
||||
|
|
||||
|
//Linux or OSX
|
||||
|
if (File.Exists("/bin/bash")) |
||||
|
{ |
||||
|
return "/bin/bash"; |
||||
|
} |
||||
|
|
||||
|
if (File.Exists("/bin/sh")) |
||||
|
{ |
||||
|
return "/bin/sh"; //some Linux distributions like Alpine doesn't have bash
|
||||
|
} |
||||
|
|
||||
|
throw new AbpException($"Cannot determine shell command for this OS! " + |
||||
|
$"Running on OS: {System.Runtime.InteropServices.RuntimeInformation.OSDescription} | " + |
||||
|
$"OS Architecture: {System.Runtime.InteropServices.RuntimeInformation.OSArchitecture} | " + |
||||
|
$"Framework: {System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription} | " + |
||||
|
$"Process Architecture{System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture}"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
namespace Volo.Abp.Studio.Helpers |
||||
|
{ |
||||
|
public interface ICmdHelper |
||||
|
{ |
||||
|
void RunCmd(string command, string workingDirectory = null); |
||||
|
|
||||
|
string RunCmdAndGetOutput(string command, string workingDirectory = null); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using System; |
||||
|
using System.Runtime.InteropServices; |
||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Helpers |
||||
|
{ |
||||
|
public static class PathHelper |
||||
|
{ |
||||
|
public static string GetRelativePath([NotNull] string basePath, [NotNull] string targetPath) |
||||
|
{ |
||||
|
Check.NotNull(basePath, nameof(basePath)); |
||||
|
Check.NotNull(targetPath, nameof(targetPath)); |
||||
|
|
||||
|
return new Uri(basePath).MakeRelativeUri(new Uri(targetPath)).ToString(); |
||||
|
} |
||||
|
|
||||
|
public static string EnsureForwardSlash(string path) |
||||
|
{ |
||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
||||
|
{ |
||||
|
return path.Replace("\\", "/"); |
||||
|
} |
||||
|
|
||||
|
return path; |
||||
|
} |
||||
|
|
||||
|
public static string Normalize(string path) |
||||
|
{ |
||||
|
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) |
||||
|
{ |
||||
|
return path.Replace("/", "\\"); |
||||
|
} |
||||
|
|
||||
|
return path; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,77 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO.Abstractions; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Packages.Modifying |
||||
|
{ |
||||
|
public class AbpModuleFileManager : IAbpModuleFileManager, ITransientDependency |
||||
|
{ |
||||
|
public IFileSystem FileSystem { get; } |
||||
|
|
||||
|
public AbpModuleFileManager(IFileSystem fileSystem) |
||||
|
{ |
||||
|
FileSystem = fileSystem; |
||||
|
} |
||||
|
|
||||
|
public async Task AddDependency(string filePath, string moduleToAdd) |
||||
|
{ |
||||
|
var fileContent = await FileSystem.File.ReadAllTextAsync(filePath); |
||||
|
var moduleName = moduleToAdd.Split(".").Last(); |
||||
|
var moduleNamespace = moduleToAdd.RemovePostFix("." + moduleName); |
||||
|
var usingStatement = $"using {moduleNamespace};"; |
||||
|
var dependsOnStart = $"DependsOn("; |
||||
|
|
||||
|
if (fileContent.Contains($"typeof({moduleName})")) |
||||
|
{ |
||||
|
// module already added
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
if (!fileContent.NormalizeLineEndings().SplitToLines().Any(l=> l.Trim().StartsWith("namespace ") && l.Contains(moduleNamespace)) && |
||||
|
!fileContent.Contains(usingStatement) |
||||
|
) |
||||
|
{ |
||||
|
fileContent = usingStatement + Environment.NewLine + fileContent; |
||||
|
} |
||||
|
|
||||
|
if (!fileContent.Contains(dependsOnStart)) |
||||
|
{ |
||||
|
var fileLines = fileContent.NormalizeLineEndings().SplitToLines().ToList(); |
||||
|
fileLines.InsertBefore(l=> l.Contains("public") && l.Contains("class"), $" [DependsOn(typeof({moduleName}))]"); |
||||
|
fileContent = fileLines.JoinAsString(Environment.NewLine); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
var fileLines = fileContent.NormalizeLineEndings().SplitToLines().ToList(); |
||||
|
var dependsOnStartLine = fileLines.First(l=> l.Contains(dependsOnStart)); |
||||
|
var dependsOnStartLineModified = dependsOnStartLine.Replace(dependsOnStart, |
||||
|
dependsOnStart + Environment.NewLine + |
||||
|
$" typeof({moduleName})," |
||||
|
); |
||||
|
fileContent = fileContent.Replace(dependsOnStartLine, dependsOnStartLineModified); |
||||
|
} |
||||
|
|
||||
|
FileSystem.File.WriteAllTextAsync(filePath, fileContent); |
||||
|
} |
||||
|
|
||||
|
public async Task<string> ExtractModuleNameWithNamespace(string filePath) |
||||
|
{ |
||||
|
var fileContent = await FileSystem.File.ReadAllTextAsync(filePath); |
||||
|
|
||||
|
var fileLines = fileContent.NormalizeLineEndings().SplitToLines(); |
||||
|
|
||||
|
var lineOfClassName = fileLines.First(l=> l.Contains("public") && l.Contains("class")); |
||||
|
|
||||
|
var moduleName = lineOfClassName.Split(":")[0].Trim().Split(" ").Last(); |
||||
|
|
||||
|
var lineOfNamespace = fileLines.First(l=> l.Trim().StartsWith("namespace")); |
||||
|
|
||||
|
var moduleNamespace = lineOfNamespace.Split(" ").Skip(1).First(); |
||||
|
|
||||
|
return moduleNamespace + "." + moduleName; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,95 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using System.Xml; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Studio.Helpers; |
||||
|
using Volo.Abp.Studio.Xml; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Packages.Modifying |
||||
|
{ |
||||
|
public class CsprojFileManager: XmlFileManagerBase, ICsprojFileManager, ITransientDependency |
||||
|
{ |
||||
|
public async Task AddProjectReferenceAsync(string filePath, string projectToReference) |
||||
|
{ |
||||
|
var document = await GetXmlDocumentAsync(filePath); |
||||
|
|
||||
|
if (document.SelectNodes($"/Project/ItemGroup/ProjectReference[starts-with(@Include, '{projectToReference}')]").Count > 0) |
||||
|
{ |
||||
|
// Project reference is already added.
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var relativePath = PathHelper.GetRelativePath(filePath, projectToReference); |
||||
|
|
||||
|
var itemGroupNode = GetOrCreateItemGroupNode(document); |
||||
|
|
||||
|
var newNode = document.CreateElement("ProjectReference"); |
||||
|
|
||||
|
var includeAttr = document.CreateAttribute("Include"); |
||||
|
includeAttr.Value = relativePath; |
||||
|
newNode.Attributes.Append(includeAttr); |
||||
|
|
||||
|
itemGroupNode.AppendChild(newNode); |
||||
|
|
||||
|
await SaveXmlDocumentAsync(filePath, document); |
||||
|
} |
||||
|
|
||||
|
public async Task AddPackageReferenceAsync(string filePath, string packageName, string version) |
||||
|
{ |
||||
|
var document = await GetXmlDocumentAsync(filePath); |
||||
|
|
||||
|
if (document.SelectNodes($"/Project/ItemGroup/PackageReference[starts-with(@Include, '{packageName}')]").Count > 0) |
||||
|
{ |
||||
|
// Package reference is already added.
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
var itemGroupNode = GetOrCreateItemGroupNode(document); |
||||
|
|
||||
|
var newNode = document.CreateElement("PackageReference"); |
||||
|
|
||||
|
var includeAttr = document.CreateAttribute("Include"); |
||||
|
includeAttr.Value = packageName; |
||||
|
newNode.Attributes.Append(includeAttr); |
||||
|
|
||||
|
var versionAttr = document.CreateAttribute("Version"); |
||||
|
versionAttr.Value = version; |
||||
|
newNode.Attributes.Append(versionAttr); |
||||
|
|
||||
|
itemGroupNode.AppendChild(newNode); |
||||
|
itemGroupNode.AppendChild(document.CreateWhitespace(Environment.NewLine + " ")); |
||||
|
|
||||
|
await SaveXmlDocumentAsync(filePath, document); |
||||
|
} |
||||
|
|
||||
|
private XmlNode GetOrCreateItemGroupNode(XmlDocument document) |
||||
|
{ |
||||
|
var nodes = document["Project"].SelectNodes("ItemGroup"); |
||||
|
|
||||
|
if (nodes == null || nodes.Count < 1) |
||||
|
{ |
||||
|
var newNode = document.CreateElement("ItemGroup"); |
||||
|
document["Project"].AppendChild(newNode); |
||||
|
return newNode; |
||||
|
} |
||||
|
|
||||
|
foreach (XmlNode node in nodes) |
||||
|
{ |
||||
|
if (node.SelectNodes("ProjectReference").Count > 0) |
||||
|
{ |
||||
|
return node; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
foreach (XmlNode node in nodes) |
||||
|
{ |
||||
|
if (node.SelectNodes("PackageReference").Count > 0) |
||||
|
{ |
||||
|
return node; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return nodes[0]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Packages.Modifying |
||||
|
{ |
||||
|
public interface IAbpModuleFileManager |
||||
|
{ |
||||
|
Task AddDependency(string filePath, string moduleToAdd); |
||||
|
|
||||
|
Task<string> ExtractModuleNameWithNamespace(string filePath); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Packages.Modifying |
||||
|
{ |
||||
|
public interface ICsprojFileManager |
||||
|
{ |
||||
|
Task AddProjectReferenceAsync(string filePath, string projectToReference); |
||||
|
|
||||
|
Task AddPackageReferenceAsync(string filePath, string packageName, string version); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Nuget |
||||
|
{ |
||||
|
public interface INugetSourceCodeStore |
||||
|
{ |
||||
|
Task<string> GetCachedSourceCodeFilePathAsync(string name, |
||||
|
string type, |
||||
|
string version = null, |
||||
|
bool includePreReleases = false); |
||||
|
|
||||
|
Task<string> GetCachedDllFilePathAsync(string name, |
||||
|
string type, |
||||
|
string version = null, |
||||
|
bool includePreReleases = false, |
||||
|
bool includeDependencies = false); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
using System; |
||||
|
using System.IO; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Studio.Helpers; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Nuget |
||||
|
{ |
||||
|
public class NugetPackageCacheManager : ITransientDependency |
||||
|
{ |
||||
|
private readonly ICmdHelper _cmdHelper; |
||||
|
|
||||
|
public NugetPackageCacheManager(ICmdHelper cmdHelper) |
||||
|
{ |
||||
|
_cmdHelper = cmdHelper; |
||||
|
} |
||||
|
|
||||
|
public async Task<string> CachePackageAsync(string packageName, string version, bool deleteAfter = true) |
||||
|
{ |
||||
|
var temporaryFolder = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); |
||||
|
|
||||
|
Directory.CreateDirectory(temporaryFolder); |
||||
|
|
||||
|
_cmdHelper.RunCmdAndGetOutput("dotnet new console -lang c#", temporaryFolder); |
||||
|
_cmdHelper.RunCmdAndGetOutput($"dotnet add package {packageName} --version {version}", temporaryFolder); |
||||
|
|
||||
|
if (deleteAfter) |
||||
|
{ |
||||
|
Directory.Delete(temporaryFolder, true); |
||||
|
} |
||||
|
|
||||
|
return temporaryFolder; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,151 @@ |
|||||
|
using System; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Cli.NuGet; |
||||
|
using Volo.Abp.Cli.ProjectBuilding; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Studio.Helpers; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Nuget |
||||
|
{ |
||||
|
[Dependency(ReplaceServices = true)] |
||||
|
public class NugetSourceCodeStore : ISourceCodeStore, INugetSourceCodeStore, ITransientDependency |
||||
|
{ |
||||
|
private readonly NuGetService _nuGetService; |
||||
|
private readonly NugetPackageCacheManager _nugetPackageCacheManager; |
||||
|
private readonly ICmdHelper _cmdHelper; |
||||
|
|
||||
|
public NugetSourceCodeStore( |
||||
|
NuGetService nuGetService, |
||||
|
NugetPackageCacheManager nugetPackageCacheManager, |
||||
|
ICmdHelper cmdHelper) |
||||
|
{ |
||||
|
_nuGetService = nuGetService; |
||||
|
_nugetPackageCacheManager = nugetPackageCacheManager; |
||||
|
_cmdHelper = cmdHelper; |
||||
|
} |
||||
|
|
||||
|
public async Task<TemplateFile> GetAsync( |
||||
|
string name, |
||||
|
string type, |
||||
|
string version = null, |
||||
|
string templateSource = null, |
||||
|
bool includePreReleases = false) |
||||
|
{ |
||||
|
if (type == SourceCodeTypes.Template) |
||||
|
{ |
||||
|
name = TemplateNugetPackageInfoProvider.GetNugetPackageName(name); |
||||
|
} |
||||
|
|
||||
|
var latestVersion = await GetLatestVersionAsync(name, includePreReleases); |
||||
|
|
||||
|
if (version == null) |
||||
|
{ |
||||
|
version = latestVersion; |
||||
|
} |
||||
|
|
||||
|
var localCachedFilePath = await GetLocalCacheSourceCodeFilePathInternal(name, version); |
||||
|
|
||||
|
return new TemplateFile(await File.ReadAllBytesAsync(localCachedFilePath), version, latestVersion, latestVersion); |
||||
|
} |
||||
|
|
||||
|
public async Task<string> GetCachedSourceCodeFilePathAsync(string name, string type, string version = null, |
||||
|
bool includePreReleases = false) |
||||
|
{ |
||||
|
if (type == SourceCodeTypes.Template) |
||||
|
{ |
||||
|
name = TemplateNugetPackageInfoProvider.GetNugetPackageName(name); |
||||
|
} |
||||
|
|
||||
|
if (version == null) |
||||
|
{ |
||||
|
version = await GetLatestVersionAsync(name, includePreReleases); |
||||
|
} |
||||
|
|
||||
|
return await GetLocalCacheSourceCodeFilePathInternal(name, version); |
||||
|
} |
||||
|
|
||||
|
public async Task<string> GetCachedDllFilePathAsync(string name, string type, string version = null, bool includePreReleases = false, bool includeDependencies = false) |
||||
|
{ |
||||
|
if (type == SourceCodeTypes.Template) |
||||
|
{ |
||||
|
name = TemplateNugetPackageInfoProvider.GetNugetPackageName(name); |
||||
|
} |
||||
|
|
||||
|
if (version == null) |
||||
|
{ |
||||
|
version = await GetLatestVersionAsync(name, includePreReleases); |
||||
|
} |
||||
|
|
||||
|
var localDllFolder = Path.Combine( |
||||
|
GetLocalNugetCachePath(), |
||||
|
name, |
||||
|
version, |
||||
|
"lib"); |
||||
|
|
||||
|
if (!Directory.Exists(localDllFolder) || |
||||
|
(includeDependencies && !Directory.GetFiles(localDllFolder, $"*Volo.Abp.Studio.ModuleInstaller.dll", SearchOption.AllDirectories).Any())) |
||||
|
{ |
||||
|
if (includeDependencies) |
||||
|
{ |
||||
|
var temporaryFolder = await _nugetPackageCacheManager.CachePackageAsync(name, version, false); |
||||
|
|
||||
|
var outputFolder = Path.GetDirectoryName( |
||||
|
Directory |
||||
|
.GetFiles(localDllFolder, $"*{name}.dll", SearchOption.AllDirectories) |
||||
|
.First() |
||||
|
); |
||||
|
|
||||
|
_cmdHelper.RunCmdAndGetOutput($"dotnet build -o {outputFolder}", temporaryFolder); |
||||
|
|
||||
|
Directory.Delete(temporaryFolder, true); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
await _nugetPackageCacheManager.CachePackageAsync(name, version); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (!Directory.Exists(localDllFolder)) |
||||
|
{ |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
return Directory.GetFiles(localDllFolder, $"{name}.dll", SearchOption.AllDirectories).First(); |
||||
|
} |
||||
|
|
||||
|
private async Task<string> GetLatestVersionAsync(string nugetPackage, bool includePreReleases) |
||||
|
{ |
||||
|
var v = await _nuGetService.GetLatestVersionOrNullAsync(nugetPackage, includePreReleases); |
||||
|
|
||||
|
return v.ToString(); |
||||
|
} |
||||
|
|
||||
|
private async Task<string> GetLocalCacheSourceCodeFilePathInternal(string name, string version) |
||||
|
{ |
||||
|
var localCacheFile = Path.Combine( |
||||
|
GetLocalNugetCachePath(), |
||||
|
name, |
||||
|
version, |
||||
|
"content", |
||||
|
$"{name}.zip"); |
||||
|
|
||||
|
|
||||
|
if (!File.Exists(localCacheFile)) |
||||
|
{ |
||||
|
await _nugetPackageCacheManager.CachePackageAsync(name, version); |
||||
|
} |
||||
|
|
||||
|
return localCacheFile; |
||||
|
} |
||||
|
|
||||
|
private string GetLocalNugetCachePath() |
||||
|
{ |
||||
|
return Path.Combine( |
||||
|
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), |
||||
|
".nuget", |
||||
|
"packages"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Nuget |
||||
|
{ |
||||
|
public static class TemplateNugetPackageInfoProvider |
||||
|
{ |
||||
|
public static string GetNugetPackageName(string template) |
||||
|
{ |
||||
|
switch (template) |
||||
|
{ |
||||
|
case "app": |
||||
|
return "Cotur.Basic.Template"; // todo: replace with real template!
|
||||
|
default: |
||||
|
return null; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,51 @@ |
|||||
|
using System; |
||||
|
using System.IO; |
||||
|
using System.IO.Abstractions; |
||||
|
using System.Threading.Tasks; |
||||
|
using System.Xml; |
||||
|
using System.Xml.Linq; |
||||
|
using Volo.Abp.Threading; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Xml |
||||
|
{ |
||||
|
public abstract class XmlFileManagerBase |
||||
|
{ |
||||
|
public IFileSystem FileSystem { get; set; } |
||||
|
|
||||
|
public ICancellationTokenProvider CancellationTokenProvider { get; set; } |
||||
|
|
||||
|
protected async Task<XmlDocument> GetXmlDocumentAsync(string filePath) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
var doc = new XmlDocument() { PreserveWhitespace = true }; |
||||
|
doc.Load(GenerateStreamFromString(await FileSystem.File.ReadAllTextAsync(filePath))); |
||||
|
return doc; |
||||
|
} |
||||
|
catch (Exception ex) |
||||
|
{ |
||||
|
throw new AbpException($"Error while reading {filePath} as XML document.", innerException: ex); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
protected async Task SaveXmlDocumentAsync(string filePath, XmlDocument rootNode) |
||||
|
{ |
||||
|
await SaveFileContentAsync(filePath, XDocument.Parse(rootNode.OuterXml).ToString()); |
||||
|
} |
||||
|
|
||||
|
protected async Task SaveFileContentAsync(string filePath, string content) |
||||
|
{ |
||||
|
await FileSystem.File.WriteAllTextAsync(filePath, content, CancellationTokenProvider.Token); |
||||
|
} |
||||
|
|
||||
|
private MemoryStream GenerateStreamFromString(string s) |
||||
|
{ |
||||
|
var stream = new MemoryStream(); |
||||
|
var writer = new StreamWriter(stream); |
||||
|
writer.Write(s); |
||||
|
writer.Flush(); |
||||
|
stream.Position = 0; |
||||
|
return stream; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\..\..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.Core\Volo.Abp.Core.csproj" /> |
||||
|
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.Cli.Core\Volo.Abp.Cli.Core.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using Volo.Abp.Cli; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.Studio |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpCliCoreModule) |
||||
|
)] |
||||
|
public class AbpStudioDomainSharedModule : AbpModule |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
namespace Volo.Abp.Studio |
||||
|
{ |
||||
|
public static class AbpStudioErrorCodes |
||||
|
{ |
||||
|
public const string SolutionAlreadyExists = "AbpStudio:SolutionAlreadyExists"; |
||||
|
public const string ModuleAlreadyExistsInTheSolution = "AbpStudio:ModuleAlreadyExistsInTheSolution"; |
||||
|
public const string ModuleFileAlreadyExists = "AbpStudio:ModuleFileAlreadyExists"; |
||||
|
public const string IncorrectFileFormat = "AbpStudio:IncorrectFileFormat"; |
||||
|
public const string ModuleNotFound = "AbpStudio:ModuleNotFound"; |
||||
|
public const string ModuleNotSpecified = "AbpStudio:ModuleNotSpecified"; |
||||
|
public const string SolutionNotSpecified = "AbpStudio:SolutionNotSpecified"; |
||||
|
public const string ProjectAlreadyExistInTheModule = "AbpStudio:ProjectAlreadyExistInTheModule"; |
||||
|
public const string IncorrectSolutionFileFormat = "AbpStudio:IncorrectSolutionFileFormat"; |
||||
|
public const string FolderNotFound = "AbpStudio:FolderNotFound"; |
||||
|
public const string ProjectWithSameNameAlreadyExistInTheSolutionFile = "AbpStudio:ProjectWithSameNameAlreadyExistInTheSolutionFile"; |
||||
|
public const string UndefinedPackageTemplate = "AbpStudio:UndefinedPackageTemplate"; |
||||
|
public const string PackageTemplateNotSpecified = "AbpStudio:PackageTemplateNotSpecified"; |
||||
|
public const string PackageNameMustBeSpecified = "AbpStudio:PackageNameMustBeSpecified"; |
||||
|
public const string FileAlreadyExists = "AbpStudio:FileAlreadyExists"; |
||||
|
public const string PackageNotSpecified = "AbpStudio:PackageNotSpecified"; |
||||
|
public const string DbmsMustBeSpecified = "AbpStudio:DbmsMustBeSpecified"; |
||||
|
public const string UserNotLoggedIn = "AbpStudio:UserNotLoggedIn"; |
||||
|
public const string PackageAlreadyExist = "AbpStudio:PackageAlreadyExist"; |
||||
|
public const string AbpModuleFileNotFound = "AbpStudio:AbpModuleFileNotFound"; |
||||
|
public const string DllNotFound = "AbpStudio:DllNotFound"; |
||||
|
public const string PackageNotFound = "AbpStudio:PackageNotFound"; |
||||
|
public const string FileNotFound = "AbpStudio:FileNotFound"; |
||||
|
public const string IncorrectFolderName = "AbpStudio:IncorrectFolderName "; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>netstandard2.0</TargetFramework> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\Volo.Abp.Studio.Analyzing.Abstractions\Volo.Abp.Studio.Analyzing.Abstractions.csproj" /> |
||||
|
<ProjectReference Include="..\..\..\framework\src\Volo.Abp.Core\Volo.Abp.Core.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,13 @@ |
|||||
|
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.Studio.Analyzing; |
||||
|
|
||||
|
namespace Volo.Abp.Studio |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpStudioAnalyzingAbstractionsModule) |
||||
|
)] |
||||
|
public class AbpStudioModuleInstallerAbstractionsModule : AbpModule |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
using JetBrains.Annotations; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.Analyzing |
||||
|
{ |
||||
|
public class AnalyzingOptions |
||||
|
{ |
||||
|
public bool Force { get; set; } = false; |
||||
|
|
||||
|
[CanBeNull] |
||||
|
public string AnalyzeConfigurationFile { get; set; } |
||||
|
|
||||
|
[CanBeNull] |
||||
|
public string SettingNamePrefix { get; set; } |
||||
|
|
||||
|
[CanBeNull] |
||||
|
public string FeatureNamePrefix { get; set; } |
||||
|
|
||||
|
// Combines two options
|
||||
|
// The second option has more priority
|
||||
|
public static AnalyzingOptions Combine([CanBeNull] AnalyzingOptions first, [CanBeNull] AnalyzingOptions second) |
||||
|
{ |
||||
|
if (second == null && first == null) |
||||
|
{ |
||||
|
return new AnalyzingOptions(); |
||||
|
} |
||||
|
|
||||
|
if (second == null) |
||||
|
{ |
||||
|
return first; |
||||
|
} |
||||
|
|
||||
|
if (first == null) |
||||
|
{ |
||||
|
return second; |
||||
|
} |
||||
|
|
||||
|
return new AnalyzingOptions |
||||
|
{ |
||||
|
AnalyzeConfigurationFile = second.AnalyzeConfigurationFile ?? first.AnalyzeConfigurationFile, |
||||
|
SettingNamePrefix = second.SettingNamePrefix ?? first.SettingNamePrefix, |
||||
|
FeatureNamePrefix = second.FeatureNamePrefix ?? first.FeatureNamePrefix |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.ModuleInstalling |
||||
|
{ |
||||
|
public interface IModuleInstallingPipelineBuilder |
||||
|
{ |
||||
|
Task<ModuleInstallingPipeline> BuildAsync(ModuleInstallingContext context); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,56 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using JetBrains.Annotations; |
||||
|
using Volo.Abp.Studio.Packages; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.ModuleInstalling |
||||
|
{ |
||||
|
public class ModuleInstallingContext |
||||
|
{ |
||||
|
public bool WithSourceCode { get; set; } |
||||
|
|
||||
|
public bool AddToSolutionFile { get; set; } |
||||
|
|
||||
|
public string Version { get; set; } |
||||
|
|
||||
|
public List<PackageInfo> TargetModulePackages { get; protected set; } |
||||
|
|
||||
|
public List<PackageInfoWithAnalyze> ReferenceModulePackages { get; protected set; } |
||||
|
|
||||
|
public Dictionary<string,string> Options { get; } |
||||
|
|
||||
|
public IServiceProvider ServiceProvider { get; } |
||||
|
|
||||
|
public ModuleInstallingContext( |
||||
|
bool withSourceCode, |
||||
|
bool addToSolutionFile, |
||||
|
string version, |
||||
|
Dictionary<string,string> options, |
||||
|
IServiceProvider serviceProvider) |
||||
|
{ |
||||
|
WithSourceCode = withSourceCode; |
||||
|
AddToSolutionFile = addToSolutionFile; |
||||
|
Version = version; |
||||
|
Options = options; |
||||
|
|
||||
|
TargetModulePackages = new List<PackageInfo>(); |
||||
|
ReferenceModulePackages = new List<PackageInfoWithAnalyze>(); |
||||
|
|
||||
|
ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); |
||||
|
} |
||||
|
|
||||
|
public void SetReferenceModulePackages([NotNull] List<PackageInfoWithAnalyze> referenceModulePackages) |
||||
|
{ |
||||
|
Check.NotNull(referenceModulePackages, nameof(referenceModulePackages)); |
||||
|
|
||||
|
ReferenceModulePackages = referenceModulePackages; |
||||
|
} |
||||
|
|
||||
|
public void SetTargetModulePackages([NotNull] List<PackageInfo> targetModulePackages) |
||||
|
{ |
||||
|
Check.NotNull(targetModulePackages, nameof(targetModulePackages)); |
||||
|
|
||||
|
TargetModulePackages = targetModulePackages; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,26 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.ModuleInstalling |
||||
|
{ |
||||
|
public class ModuleInstallingPipeline |
||||
|
{ |
||||
|
public ModuleInstallingContext Context { get; } |
||||
|
|
||||
|
public List<ModuleInstallingPipelineStep> Steps { get; } |
||||
|
|
||||
|
public ModuleInstallingPipeline(ModuleInstallingContext context) |
||||
|
{ |
||||
|
Context = context; |
||||
|
Steps = new List<ModuleInstallingPipelineStep>(); |
||||
|
} |
||||
|
|
||||
|
public async Task ExecuteAsync() |
||||
|
{ |
||||
|
foreach (var step in Steps) |
||||
|
{ |
||||
|
await step.ExecuteAsync(Context); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.ModuleInstalling |
||||
|
{ |
||||
|
public abstract class ModuleInstallingPipelineStep |
||||
|
{ |
||||
|
public abstract Task ExecuteAsync(ModuleInstallingContext context); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
|
<Import Project="..\..\..\..\..\common.props" /> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>net5.0</TargetFramework> |
||||
|
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest> |
||||
|
<RootNamespace /> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\Volo.Abp.Studio.Domain.CommonServices\Volo.Abp.Studio.Domain.CommonServices.csproj" /> |
||||
|
<ProjectReference Include="..\Volo.Abp.Studio.ModuleInstaller.Abstractions\Volo.Abp.Studio.ModuleInstaller.Abstractions.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,16 @@ |
|||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.Studio |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpStudioDomainCommonServicesModule), |
||||
|
typeof(AbpStudioModuleInstallerAbstractionsModule) |
||||
|
)] |
||||
|
public class AbpStudioModuleInstallerModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using Volo.Abp.Studio.ModuleInstalling.Steps; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.ModuleInstalling |
||||
|
{ |
||||
|
public abstract class ModuleInstallingPipelineBuilderBase |
||||
|
{ |
||||
|
protected ModuleInstallingPipeline GetBasePipeline(ModuleInstallingContext context) |
||||
|
{ |
||||
|
var pipeline = new ModuleInstallingPipeline(context); |
||||
|
|
||||
|
pipeline.Steps.Add(new PackageReferencingStep()); |
||||
|
|
||||
|
return pipeline; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,74 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Volo.Abp.Studio.Packages; |
||||
|
using Volo.Abp.Studio.Packages.Modifying; |
||||
|
using Volo.Abp.Studio.Analyzing.Models.Module; |
||||
|
|
||||
|
namespace Volo.Abp.Studio.ModuleInstalling.Steps |
||||
|
{ |
||||
|
public class PackageReferencingStep : ModuleInstallingPipelineStep |
||||
|
{ |
||||
|
public override async Task ExecuteAsync(ModuleInstallingContext context) |
||||
|
{ |
||||
|
var _csprojFileManager = context.ServiceProvider.GetRequiredService<ICsprojFileManager>(); |
||||
|
var _abpModuleFileManager = context.ServiceProvider.GetRequiredService<IAbpModuleFileManager>(); |
||||
|
|
||||
|
foreach (var referencePackage in context.ReferenceModulePackages) |
||||
|
{ |
||||
|
var targetPackages = GetTargetPackages(context.TargetModulePackages, referencePackage); |
||||
|
|
||||
|
foreach (var targetPackage in targetPackages) |
||||
|
{ |
||||
|
await _csprojFileManager.AddPackageReferenceAsync( |
||||
|
targetPackage.Path.RemovePostFix(PackageConsts.FileExtension) + ".csproj", |
||||
|
referencePackage.Name, |
||||
|
context.Version); |
||||
|
|
||||
|
var targetAbpModulePath = FindAbpModuleFile(targetPackage.Path); |
||||
|
|
||||
|
await _abpModuleFileManager.AddDependency(targetAbpModulePath, FindAbpModuleName(referencePackage)); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private string FindAbpModuleFile(string targetPackagePath) |
||||
|
{ |
||||
|
return Directory.GetFiles(Path.GetDirectoryName(targetPackagePath), "*Module.cs", |
||||
|
SearchOption.AllDirectories) |
||||
|
.FirstOrDefault(); |
||||
|
} |
||||
|
|
||||
|
private string FindAbpModuleName(PackageInfoWithAnalyze package) |
||||
|
{ |
||||
|
var abpModuleModel = package.Analyze.Contents.Where(y => |
||||
|
y.ContentType == AbpModuleModel.ContentTypeName |
||||
|
).Cast<AbpModuleModel>().First(); |
||||
|
|
||||
|
return abpModuleModel.Namespace + "." + abpModuleModel.Name; |
||||
|
} |
||||
|
|
||||
|
private List<PackageInfo> GetTargetPackages(List<PackageInfo> targetModulePackages, |
||||
|
PackageInfoWithAnalyze referencePackage) |
||||
|
{ |
||||
|
if (PackageTypes.IsHostProject(referencePackage.Role)) |
||||
|
{ |
||||
|
return new List<PackageInfo>(); |
||||
|
} |
||||
|
|
||||
|
if (PackageTypes.IsUiProject(referencePackage.Role)) |
||||
|
{ |
||||
|
var useHostBlazorServerForMvcPackages = targetModulePackages.All(p => p.Role != PackageTypes.HostMvc); |
||||
|
var targetHostType = |
||||
|
PackageTypes.GetHostTypeOfUi(referencePackage.Role, useHostBlazorServerForMvcPackages); |
||||
|
|
||||
|
return targetModulePackages.Where(p => p.Role == targetHostType).ToList(); |
||||
|
} |
||||
|
|
||||
|
return targetModulePackages.Where(p => p.Role == referencePackage.Role).ToList(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue