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.
上下文
- 我使用一个插件系统加载位于 'bin/Plugin' 文件夹下的插件 dll。
- 每个插件都带有一个配置文件(即MyPlugin.dll + MyPlugin.config)
- 每个插件都使用私有 NuGet 服务器.
进行分发
- 我的项目中没有“.nuspec”文件。 '.nupkg' 包是使用 '.csproj' 生成的,'nuspec' 是由 nuget pack 命令自动生成的。
- NuGet 项目和使用 NuGet 的项目都使用 .NetFramework 和 packages.config(而不是 packageReferences).
目标
由于插件是使用 NuGet 分发的,因此需要注意两点:
- 安装NuGet包时,不要将dll放在'bin'文件夹中,应该放在'bin/Plugin'子文件夹中。
- 在 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.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.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 开始,我花了很多时间来实现这一目标,希望它也能帮助其他人:)
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.
上下文
- 我使用一个插件系统加载位于 'bin/Plugin' 文件夹下的插件 dll。
- 每个插件都带有一个配置文件(即MyPlugin.dll + MyPlugin.config)
- 每个插件都使用私有 NuGet 服务器. 进行分发
- 我的项目中没有“.nuspec”文件。 '.nupkg' 包是使用 '.csproj' 生成的,'nuspec' 是由 nuget pack 命令自动生成的。
- NuGet 项目和使用 NuGet 的项目都使用 .NetFramework 和 packages.config(而不是 packageReferences).
目标
由于插件是使用 NuGet 分发的,因此需要注意两点:
- 安装NuGet包时,不要将dll放在'bin'文件夹中,应该放在'bin/Plugin'子文件夹中。
- 在 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.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.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 开始,我花了很多时间来实现这一目标,希望它也能帮助其他人:)