NuGet中的插件容器

时间:2018-04-16 12:36:25

标签: c# .net .net-core nuget

我正在尝试在.NET Core MVC Api中创建模块化web api。我之前在经典的.NET中做过这个,但是我使用了MEF。我的所有插件容器都在不同的NuGet包中,我会相应地恢复它们。 但是,在新版本中,NuGet包存储在常规文件夹中而不是解决方案中。为了我的脚本找到插件(通过接口)我需要加载我的程序集,但我找不到它们,因为NuGet包的DLL不再在解决方案中。

我可以将NuGet的恢复目录设置为我的解决方案吗?或者还有其他方法可以解决这个问题。

由于

---- ----更新

感谢UserName提出了这个解决方案:

编辑MVC API的CSPROJ文件并更改:

<ItemGroup>
   <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" />
   <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" />
   <PackageReference Include="NeedsToBeLocal" Version="1.1.0" />
</ItemGroup>

对此:

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.6" ExcludeAssets="Runtime"/>
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.0.3" ExcludeAssets="Runtime"/>
    <PackageReference Include="NeedsToBeLocal" Version="1.1.0" />
</ItemGroup>

(请注意ExcludeAssets =&#34; Runtime&#34;)。

接下来,添加以下属性组:

<PropertyGroup>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>

最后,将这些目标添加到CSPROJ:

<Target Name="CopyAdditionalFilesToLayout" Condition="'$(TargetFramework)' == ''" DependsOnTargets="PrepareAdditionalFilesToLayout" AfterTargets="Build" Inputs="@(LayoutFile)" Outputs="@(LayoutFile-&gt;'$(PackageLayoutOutputPath)%(TargetPath)')">
    <Copy SourceFiles="@(LayoutFile)" DestinationFiles="@(LayoutFile-&gt;'$(PackageLayoutOutputPath)%(TargetPath)')">
      <Output TaskParameter="DestinationFiles" ItemName="FileWrites" />
    </Copy>
</Target>  

<Target Name="FilterCopyLocal" DependsOnTargets="GetFrameworkPaths;GetReferenceAssemblyPaths;RunResolvePublishAssemblies" BeforeTargets="ResolveLockFileCopyLocalProjectDeps">
    <ItemGroup>
      <_CopyLocalButNotPublished Include="@(AllCopyLocalItems)" Exclude="@(ResolvedAssembliesToPublish)" />
      <AllCopyLocalItems Remove="@(_CopyLocalButNotPublished)" />
    </ItemGroup>
</Target>

清洁&amp;重建和正确的库将被复制到调试文件夹(在我的情况下为netcoreapp2.0)。

1 个答案:

答案 0 :(得分:1)

其中一种可能的方法是在项目中使用RestorePackagesPath属性:

<PropertyGroup>
  <RestorePackagesPath>..\packages</RestorePackagesPath>
</PropertyGroup>

来自documentation

  

RestorePackagesPath - 用户包文件夹的路径。全部下载了   这里提取包。相当于--netnet中的--packages   还原

您可以使用CopyLocalLockFileAssemblies属性。如果它设置为true,则依赖项将从NuGet缓存复制到输出文件夹。

<PropertyGroup>
  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>