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

NuGet packages: Place dll and config files under a sub-directory

Found many outdated and/or relevant-but-not-enough solutions, hence i will give it a shot hoping that i am not asking a duplicate question.

上下文

目标

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

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

关于如何完成 (1) 和 (2) 有什么建议吗?


Removed the previously added unsuccessful steps from the question and posted an answer

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

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

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

<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) 通过单击 Pack 菜单重新打包 MyPlugin 项目。在安装这个新版本的 nuget 包之前,您应该先 clean nuget caches 或删除 C:\Users\xxx(current user)\.nuget\packages.

下的所有缓存文件

除了,还有.

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

更新 1

第 1 步说明:

.props 文件必须命名为您的 package_id,这样它才能在 nuget nupkg 文件上运行。请参阅我在上面提供的link。

举个例子,如果你的nuget包被命名为MyPlugin.1.0.0.nupkg,那么props文件应该被命名为MyPlugin.props文件。目标的建议是将文件从 nupkg 的 File 文件夹复制到目标主项目的 bin\Plugin 文件夹中。

第 2 步说明:

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

因此,如果您的 MyPlugin.configMyPlugin 项目的 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.props 在您的 MyPlugin 项目中的文件物理路径,以便 nuget 找到该文件。

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

原来是nupkg的作用

Anyway,这一步可以自己检查,请检查文件路径是否正确,然后确保目标文件存在于File nupkg 的文件夹。

这是我的 nupkg 结构:

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

另外,在你安装这个新版本的nuget包之前,你应该先清理nuget缓存以删除旧的,以防你仍然安装旧的。

之后,先构建你的主工程来执行目标,然后你就会看到我这里展示的效果。

找到了一个几乎完全自动化的解决我的问题的方法 (特别感谢@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的项目

This is the step where manual editing is needed. Will try to automate this as well and update the answer.

打包 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文件

保存并将包推送到服务器。现在 'consumer' 项目安装 NuGet 时,配置文件将添加到项目中。配置文件在构建项目时不会添加到bin目录

问题3:如何将文件复制到消费者的bin文件夹,在'Plugins'sub-directory

For this step a 'props' file was utilized. The props file is meant to be packed in the NuGet package, copied in the consumer's root directory and executed by the consumer project upon build.

在 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>

现在,道具文件将 end-up 在消费者项目的根目录中。按照惯例,“Directory.build.props”文件会在构建项目 (MSBuild) 时自动执行。使用 'Copy' 和 'Move' 任务,'dll' 和 'config' 都放在 'bin/Plugins' 文件夹下。

从方块 0 开始,我花了很多时间来实现这一目标,希望它也能帮助其他人:)