0

发现了许多过时和/或相关但不够的解决方案,因此我会试一试,希望我不会问重复的问题。

语境

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

目标

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

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

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


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

4

2 回答 2

1

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

1)在您的MyPlugin库项目中,您应该在Build<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 包之前,你应该先清理 nuget 缓存或删除.C:\Users\xxx(current user)\.nuget\packages

此外,还有一个类似的线程您可以参考

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

更新 1

对于第 1 步的描述:

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

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

对于第 2 步的描述:

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

因此,如果您位于MyPluginMyPlugin.config项目的 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 文件夹中。请看这个文件

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的功能。

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

这是我的 nupkg 结构:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

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

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

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

在此处输入图像描述

在此处输入图像描述

于 2020-09-24T06:12:55.637 回答
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 包内的“内容”文件夹下添加“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>

将“Directory.build.props”条目添加到“nuspec”文件。因此,第 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”和“配置”都放在“bin/Plugins”文件夹下。

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

于 2020-09-26T09:41:35.090 回答