NopCommerce插件内建自定义插件

问题描述 投票:0回答:1

我正在使用Nopcommerce 4.2,并试图创建一个自定义插件。

在运行时,我得到了错误。

System.Exception: 'A plugin with 'DiscountRequirement.MustBeAssignedToCustomerRole' system name is already defined

当我进入Nop.WebPlugins时,我可以看到所有已经建立的插件--包括我的。当我查看我的自定义插件时,我可以看到一个名为Plugins的文件夹,这个文件夹包含了所有其他已经建立的插件。

我已经看了我的csproj,并与nop默认插件进行了比较,不能解决为什么我的再次建立所有的插件。

要清楚的是,正在创建的结构是:

Nop.Web

  • 插件

    --折扣规则.客户角色(CustomerRoles)

    --ExchangeRate.EcbExchange

    --...其他插件....

    --我的.插件

    ---应用数据

    -----区域

    ---插件

    ------------------------------------------------------------------------------------------------------折扣规则.客户角色

    ----ExchangeRate.EcbExchange

    --------------------------------------------------------------------------------其他插件...

我的项目文件

<Project Sdk="Microsoft.NET.Sdk.Razor">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
      <OutputPath>..\..\Presentation\Nop.Web\Plugins\Widgets.MostViewedProducts</OutputPath>
    <OutDir>$(OutputPath)</OutDir>
    <EnableDefaultContentItems>false</EnableDefaultContentItems>
    <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies>
  </PropertyGroup>

  <ItemGroup>
    <Compile Remove="Domain\**" />
    <Content Remove="Domain\**" />
    <EmbeddedResource Remove="Domain\**" />
    <None Remove="Domain\**" />
  </ItemGroup>

  <ItemGroup>
    <None Remove="logo.jpg" />
    <None Remove="plugin.json" />
  </ItemGroup>

  <PropertyGroup>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="logo.jpg">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="plugin.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Content Update="Areas\Admin\Views\BuilderProductAttribute\Create.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProductAttribute\Edit.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProductAttribute\List.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProductAttribute\_CreateOrUpdate.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\Create.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\Edit.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\List.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\ProductAttributeCatalogCreatePopup.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\ProductAttributeMappingCreate.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\ProductAttributeMappingEdit.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdate.Attributes.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdate.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdate.Info.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdate.SEO.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdateProductAttributeMapping.Catalog.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdateProductAttributeMapping.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\BuilderProduct\_CreateOrUpdateProductAttributeMapping.Info.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\ProductBuilder\Configure.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
    <Content Update="Areas\Admin\Views\_ViewImports.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Views\BuilderProduct\AttributeMappingProduct.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Views\BuilderProduct\Details.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Views\BuilderProduct\ProductDetails.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Views\BuilderProduct\_CatalogSelectors.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Views\BuilderProduct\_ProductBox.ProductBuilder.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Update="Views\_ViewImports.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Pack>$(IncludeRazorContentInPack)</Pack>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Areas\Admin\Controllers\" />
    <Folder Include="Areas\Admin\Extensions\" />
    <Folder Include="Areas\Admin\Factories\" />
    <Folder Include="Areas\Admin\Infrastructure\" />
    <Folder Include="Areas\Admin\Models\" />
    <Folder Include="Areas\Admin\Views\" />
    <Folder Include="Controllers\" />
    <Folder Include="Extensions\" />
    <Folder Include="Factories\" />
    <Folder Include="Models\" />
  </ItemGroup>


  <ItemGroup>
    <ProjectReference Include="..\..\Presentation\Nop.Web.Framework\Nop.Web.Framework.csproj" />
    <ProjectReference Include="..\..\Presentation\Nop.Web\Nop.Web.csproj" />
    <ClearPluginAssemblies Include="$(MSBuildProjectDirectory)\..\..\Build\ClearPluginAssemblies.proj" />
  </ItemGroup>


  <ItemGroup>
    <None Update="Views\Shared\Components\Default.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="Views\_ViewImports.cshtml">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

  <!-- This target execute after "Build" target -->
  <Target Name="NopTarget" AfterTargets="Build">
    <!-- Delete unnecessary libraries from plugins path -->
    <MSBuild Projects="@(ClearPluginAssemblies)" Properties="PluginPath=$(MSBuildProjectDirectory)\$(OutDir)" Targets="NopClear" />
  </Target>
</Project>

编辑

Plugin.json

    {
  "InstalledPluginNames": [
    "Widgets.GoogleAnalytics",
    "Widgets.NivoSlider",
    "ExternalAuth.Facebook",
    "Misc.Cards",
    "Payments.PayPalSmartPaymentButtons",
    "Payments.PayPalStandard",
    "Catalog.SkipToProduct"
  ],
  "PluginNamesToUninstall": [],
  "PluginNamesToDelete": [
    "DiscountRequirement.MustBeAssignedToCustomerRole",
    "CurrencyExchange.ECB",
    "Misc.SendinBlue",
    "Payments.CheckMoneyOrder",
    "Payments.Manual",
    "Payments.Qualpay",
    "Payments.Square",
    "Pickup.PickupInStore",
    "Shipping.FixedByWeightByTotal",
    "Shipping.UPS",
    "Tax.Avalara",
    "Tax.FixedOrByCountryStateZip"
  ],
  "PluginNamesToInstall": []
}
.net-core nopcommerce .net-core-2.2
1个回答
0
投票

请清空你的垃圾箱,并删除这个""下的所有插件。Nop.Web -> 插件。"文件夹一次。这对我来说是有效的,谢谢


0
投票

有几个地方是有错误的。不检查无法给出答案,如plugin.json,dependencyregister.cs,plugin.cs等。

但是当你熟悉了之后,你就可以找到自己的方法来加快你的开发速度了。

小贴士:如果你的插件还存在任何问题,这是最简单的方法。

  1. 只要把小原插件复制一份,如'Nop.Plugin.Payments.Qualpay,Square,SendinBlue',然后重命名,然后编辑.proj文件设置输出文件夹。
  2. 删除除了'DependencyRegistrar.cs,RouteProvider.cs,plugin.json,StartUpPlugin.cs'以外的所有不必要的类、文件和文件夹。
  3. 改变其余文件的命名空间,并删除不必要的代码。
  4. 插件.json "SupportedVersions": [ "4.20"] 是一个必须的值
  5. 构建并清除所有错误。
  6. 它应该出现在'配置 > 本地配置'

小贴士:这是我的项目建设最佳实践,当我收到参考资料错误的时候

  1. 清洗溶液
  2. 进入 ~APIPresentationNop.WebPlugins 文件夹,删除所有的构建文件夹。
  3. 右键点击'图书馆'文件夹并建立它。
  4. 右键单击'演示文稿'文件夹并建立它。
  5. 右键单击'插件'文件夹并建立它。
  6. 祝你好运...!

你可以参考下面的模板

插件.json ("SupportedVersions": [ "4.20"] 是一个必须的值),否则插件服务将不会选择你的插件。

{
  "Group": "Plugin group name",
  "FriendlyName": "Elastic Search",
  "SystemName": "Custom.Plugin.ElasticSearch",
  "Version": "1.56",
  "SupportedVersions": [ "4.20" ],
  "Author": "Isanka Thalagala",
  "DisplayOrder": 27,
  "FileName": "Custom.Plugin.ElasticSearch.dll",
  "Description": "This plugin provice ilastic search"
}

DependencyRegistrar.cs class

public class DependencyRegistrar : IDependencyRegistrar
{
   /// <summary>
   /// Register services and interfaces
   /// </summary>
   /// <param name="builder">Container builder</param>
   /// <param name="typeFinder">Type finder</param>
   /// <param name="config">Config</param>
   public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config)
   {
      //register service manager
      builder.RegisterType<SearchFilterService>().As<ISearchFilterService>().InstancePerLifetimeScope();
      builder.RegisterType<ElasticSearchService>().As<IElasticSearchService>().InstancePerLifetimeScope();          
   }

   /// <summary>
   /// Gets order of this dependency registrar implementation
   /// </summary>
   public int Order => 1;
}

ElasticSearchPlugin.cs

public class ElasticSearchPlugin : BasePlugin
    {
        #region Ctor
        public ElasticSearchPlugin()
        {
        }

        #endregion

        #region Methods
        /// <summary>
        /// Install the plugin
        /// </summary>
        public override void Install()
        {
            base.Install();
        }

        /// <summary>
        /// Uninstall the plugin
        /// </summary>
        public override void Uninstall()
        {
            base.Uninstall();
        }

        #endregion

        /// <summary>
        /// Gets a value indicating whether to hide this plugin on the widget list page in the admin area
        /// </summary>
        public bool HideInWidgetList => true;
    }
© www.soinside.com 2019 - 2024. All rights reserved.