NuGet包中的程序集是否可以放在lib文件夹之外?

58

我要提出两个问题... 首先,使用NuGet,是否可以从几个DLL文件创建软件包?没有Visual Studio项目,只有命令行和几个预编译的DLL文件。

其次,如果可能的话,为什么我不断收到“Assembly outside of the lib folder”警告? 我尝试了我能想到的一切来使相关的程序集将自己添加为NuGet软件包中的引用。

我的文件结构如下所示

 Root
   - File1.dll
   - lib
     - File2.dll
     - File3.dll
我告诉NuGet使用以下.nuspec打包它时。
<?xml version="1.0"?>
<package >
  <metadata>
    <id>File1.dll</id>
    <version>1.0.0</version>
    <authors>thisguy</authors>
    <owners>thisguysmom</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>This is some library</description>
    <releaseNotes>Porting to NuGet</releaseNotes>
    <copyright>Copyright 2012</copyright>
    <references>
      <reference file="File2.dll" />      
      <reference file="File3.dll" />
    </references>
  </metadata>
</package>

我收到了这个警告。从我所读的内容来看,我甚至不需要在任何项目中定义参考节点,因为lib文件夹中的项目应该自动添加为引用?

是否有人理解这个NuGet混乱的情况?

8个回答

20

我刚刚遇到了这个问题。Nuget希望看到一个长得像这样的结构:

root
  - lib
    - net40
      - File1.dll
      - File2.dll
      - File3.dll

根据您的 .net 版本,选择适当的 net40、net20 或 net45。

运行

nuget pack yourlibrary.nuspec

进行打包操作。

这将整个文件夹打包并放入 nupkg 中。此时,错误信息将消失。


8
“net20”,“net40”,“net45”等支持列表存放在哪里维护?这些支持列表仅在添加时(而不是将文件放在“lib”下)防止将程序集包含到旧项目中吗?构建软件包时,是否通常手动维护此附加结构,还是可以检测并使用程序集的.NET版本? - brianary
4
@brianary 我相信这个列表在这里:https://learn.microsoft.com/en-us/nuget/schema/target-frameworks#supported-frameworks,而这个链接更全面地记录了上述文件夹结构:https://learn.microsoft.com/en-us/nuget/create-packages/supporting-multiple-target-frameworks。 - Jason Wall
这里的net40是指File*.dll所构建的框架?还是你将要使用/引用这些(File*.dll) dlls的项目框架? - gmuhammad
@gmuhammad 我相信net40表示项目构建所使用的框架版本。 - Jason Wall

17

50
抱歉,请问“lib文件夹”是什么?我一直在按照这个教程(http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package)来创建一个从程序集中生成nuget包,但我没有看到任何lib文件夹,只有一个用于创建规范文件(spec file)然后生成nupkg文件的命令。 - DevDave

16

在本篇文章发布时(我假设后续版本也是如此),使用当前版本的NuGet,您可以与.nuspec文件一起使用.csproj文件来创建包。我们所做的是制作一个.nuspec文件(使用nuget spec并进行自定义),并将其包含在项目中。

有了定制的.nuspec文件,我们使用了以下命令:

nuget pack sample.csproj -IncludeReferencedProjects

此时它已经构建了 .nupkg 文件并且没有发现问题。该文件出现在正常输出文件夹中(在我的默认情况下为 bin\debug)。


1
这是一个糟糕的答案。使用VS 2015和nuget 3.3,并使用您提供的确切命令,我仍然会遇到此错误。 - Mario
虽然这对我起作用了。我使用“nuget spec”从*.csproj文件创建了*.csproj.nuspec文件,并没有重命名它。只有当我尝试重命名它时才会出现错误。 - henon

13

您可以通过在nuspec文件的<dependencies>标签中添加以下内容来引用另一个dll:

<package>
   <metadata>
      ...
</metadata>
<files>
 <file src="..\ReferencedFolder\*.*" target="lib\net40\" />
</files>
</package>

我发现 src="../Xxx" ... 不起作用(即使文档说应该可以);但是由于 src 是相对于 BasePath 参数的,所以您可以将 BasePath 更改为您想要包含的所有文件的根目录。 - Richard Barnett
如果您已经构建了程序集并且只需要打包它们,那么这非常有效。 - henon

1
Alexandre指的是创建NuGet包时创建的“lib”文件夹。您可以像打开任何zip文件一样打开.nupkg文件。在那里,您将看到一个lib \ netXX文件夹,其中XX是您正在针对的.NET框架的版本。因此,在打包NuGet文件时,请确保File1.dll位于lib文件夹中。

1

我使用了 Von Lemongargle 教授的解决方案,对我来说是一个很好的解决方案。

  1. 将 spec 文件(右键单击-> 包含在项目中)包含在项目中
  2. 将 spec 文件的文件名与您的项目相同(myproject.csproj,myproject.nuspec)

这在 Visual Studio 2012 中完美运行。


重要的是要提到规范文件必须包含在项目中。 - Edward Olamisan

0

它们通过被包含在.NET的bin\debug或bin\release文件夹中进入“lib”文件夹。因此,您需要让项目编译时将外部DLL复制到本地,以便在编译时将它们包含在bin文件夹中。


0

如果依赖项或库已更改,则旧文件会影响打包操作。

  1. 从项目中删除 objbin 文件夹。
  2. 运行 dotnet restore
  3. 运行 nuget pack yournuspecfile.nuspec -properties Configuration=Release -IncludeReferencedProjects 或您的命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接