NuGet软件包:将dll和配置文件放在子目录下

时间:2020-09-23 12:19:21

标签: .net visual-studio nuget visual-studio-2019 packages.config

找到了许多过时的和/或相关的但还不够充分的解决方案,因此,我会试一试,希望我不要问一个重复的问题。

上下文

  • 我使用一个插件系统来加载位于“ bin / 插件”文件夹下的插件dll。
  • 每个插件都带有一个配置文件(即MyPlugin.dll + MyPlugin.config)
  • 每个插件都是使用私有的 NuGet服务器分发的。
  • 我的项目中没有没有'.nuspec'文件。 “ .nupkg”软件包是使用“ .csproj”生成的,“ nuspec”是通过nuget pack命令自动生成的。
  • NuGet项目和使用NuGet的项目都使用 .NetFramework packages.config (而不是packageReferences)。

目标

由于使用NuGet分发了插件,因此需要注意两点:

  1. 在安装NuGet软件包时,不要将dll放置在“ bin”文件夹中,而应将其放置在“ bin / Plugin”子文件夹中。
  2. 在NuGet软件包中包含“ .config”,并将其放置在同一位置。

关于如何完成(1)和(2)的任何建议?


从问题中删除了先前添加的不成功步骤,并发布了答案

2 个答案:

答案 0 :(得分:1)

为了实现这一目标,您应该创建一个<package_id>.props文件,该文件可以根据需要将这些文件复制到目标路径中。

1)。在您的 MyPlugin 库项目中,应该在 Build 文件夹下创建一个名为<package_id>.props的文件。

enter image description here

然后将这些内容添加到该新文件中

<Project>
    <Target Name="CopyToFolder" BeforeTargets="Build">
        <ItemGroup>
            <Files Include="$(MSBuildThisFileDirectory)..\File\*.*"></Files>
        </ItemGroup>
        <Copy SourceFiles="@(Files)" DestinationFolder="$(ProjectDir)bin\Plugin"></Copy>
        
    </Target>

</Project>

2)将这些节点添加到您的MyPlugin.csproj文件中:

<ItemGroup>
    <None Include="xxx\MyPlugin.dll(the path of MyPlugin.dll in your project)" Pack="true" PackagePath="File"></None>
    <None Include="xxx\MyPlugin.config(the path of MyPlugin.dll in your project)" Pack="true" PackagePath="File"></None>
    <None Include="Build\MyPlugin.props" Pack="true" PackagePath="build"></None>
</ItemGroup>
    

3),通过点击打包菜单重新打包 MyPlugin 项目。并且在安装此新版本的nuget软件包之前,您应该首先clean nuget caches或删除C:\Users\xxx(current user)\.nuget\packages下的所有缓存文件。

除了之外,还有a similar thread you can refer to

================================================ ====

更新1

有关步骤1的说明:

.props文件必须命名为package_id,以便它可以在nuget nupkg文件上使用。请参阅上面提供的链接。

示例,如果您的nuget包名为MyPlugin.1.0.0.nupkg,则props文件应命名为MyPlugin.props文件。目标的建议是将文件从nupkg的File文件夹复制到目标主项目的bin\Plugin文件夹。

有关第2步的说明:

这些步骤将 MyPlugin 项目文件的内容打包到nupkg中。

因此,如果您的MyPlugin.config位于 MyPlugin 项目的bin \ Release文件夹下,则应使用:

<None Include="bin\Release\netstandard2.0\MyPlugin.config(the path of MyPlugin.dll in your project)" Pack="true" PackagePath="File"></None>

您应确保bin\Release\netstandard2.0\MyPlugin.config是正确的,并且由于其相对路径(与csproj文件的路径比较),可以找到该文件。

PackagePath =“ File” 表示应将MyPlugin.config文件打包到nupkg的 File 文件夹中。

<None Include="Build\MyPlugin.props" Pack="true" PackagePath="build"></None>

此步骤是将MyPlugin.props打包到nupkg文件的build文件夹中。 Please see this document

Build\MyPlugin.props表示MyPlugin项目中MyPlugin.props的文件物理路径,以便nuget可以找到该文件。

The build folder of nupkg (3.x+) MSBuild .targets and .props files  Automatically inserted into the project.

所以这是nupkg的功能。

无论如何,此步骤可以由您自己检查,请检查文件路径是否正确,然后确保目标文件位于 File 文件夹中的数量。

这是我的nupkg结构:

enter image description here

enter image description here

enter image description here

=============================================== ======================

,在安装此新版本的nuget软件包之前,应先清理nuget缓存以删除旧缓存,以防万一您仍安装旧缓存。

之后,首先构建您的主项目以执行目标,然后您将看到我在此处显示的效果。

enter image description here

enter image description here

答案 1 :(得分:1)

找到了解决我问题的几乎全自动解决方案 (特别感谢@ Perry-Qian-MSFT为获得正确指导提供了指导)。

以下是从新手的角度实现这一目标的步骤:

问题1:如何将文件包含到“ .nupkg”中

要将“ MyPlugin.config”文件包含到“ .nupkg”中,我已经编辑了“ .csproj”文件并添加了以下内容:

<ItemGroup>
  <Content Include="MyPlugin.config">
    <Pack>true</Pack>
    <PackagePath>MyPlugin.config</PackagePath>
  </Content>
</ItemGroup>

此步骤将在nuget包内的“ content ”文件夹下添加“ MyPlugin.config”文件。 请注意,“ MyPlugin.config”文件应放在NuGet项目的根目录下。

问题2:如何将文件复制到使用nuget的项目中

这是需要手动编辑的步骤。也会尝试自动执行此操作并更新答案。

打包nuget之后(将其推送到NuGet服务器之前),打开“ nupkg”软件包(使用winzip / winrar / 7zip等),然后将以下内容添加到“ .nuspec”文件中:

<metadata>
  <contentFiles>
    <files include="MyPlugin.config" copyToOutput="true" />
  </contentFiles>
</metadata>
<files>
  <file src="MyPlugin.config" target=""/>
</files>

“ MyPlugin.dll”不需要在这里添加,因为它是一个lib文件。

保存该软件包并将其推送到服务器。现在,当“消费者”项目安装NuGet时,配置文件将添加到项目中。在构建项目时,配置文件不会添加到bin目录中

问题3:如何将文件复制到使用者的bin文件夹(位于“插件”子目录下)

在此步骤中,使用了“ props”文件。 props文件应打包在NuGet包中,复制到使用者的根目录中,并由使用者项目在构建时执行。

在NuGet的项目中添加“ Directory.build.props”文件,然后编辑“ csproj”以添加以下内容:

  <Content Include="Directory.build.props">
    <Pack>true</Pack>
    <PackagePath>Directory.build.props</PackagePath>
  </Content>

编辑“ Directory.build.props”文件的内容:

<Project>
  <Target Name="CopyToFolder" AfterTargets="Build">
    <ItemGroup>
      <ConfigFile Include="$(MSBuildThisFileDirectory)MyPlugin.config"></ConfigFile>
    </ItemGroup>
    <ItemGroup>
      <DllFile Include="$(MSBuildThisFileDirectory)bin\MyPlugin.dll"></DllFile>
    </ItemGroup>
    <Copy SourceFiles="@(ConfigFile)" DestinationFolder="$(ProjectDir)bin\Plugins"></Copy>
    <Move SourceFiles="@(DllFile)" DestinationFolder="$(ProjectDir)bin\Plugins" Condition="Exists('%(FullPath)')"></Move>
  </Target>
</Project>

在“ nuspec”文件中添加一个“ Directory.build.props”条目。因此,第2步将增强为:

  <metadata>
    <contentFiles>
      <files include="MyPlugin.config" copyToOutput="true" />
    </contentFiles>
    <contentFiles>
      <files include="Directory.build.props" copyToOutput="true" />
    </contentFiles>
  </metadata>
  <files>
    <file src="MyPlugin.config" target="Plugins"/>
    <file src="Directory.build.props" target="Plugins"/>
  </files>

现在,props文件将最终存储在消费者项目的根目录中。按照惯例,构建项目(MSBuild)时将自动执行“ Directory.build.props”文件。使用“复制”和“移动”任务,“ dll”和“ config”都放置在“ bin / Plugins”文件夹下。

从第0平方开始,我花了很多时间来实现这一目标,希望它也会对其他人有所帮助:)