【问题标题】:NuGet Assembly outside lib folderlib 文件夹外的 NuGet 程序集
【发布时间】:2012-08-05 00:38:11
【问题描述】:

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

其次,假设这是可能的,为什么我不断收到“在 lib 文件夹之外的程序集”警告?我已经尝试了所有我能想到的方法来获取关联的程序集,以将它们自己作为引用添加到 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 混乱吗?

【问题讨论】:

    标签: nuget nuget-package


    【解决方案1】:

    我刚刚遇到了这个问题。 Nuget 期望的结构如下所示:

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

    net40 或 net20 或 net45 适合您的 .net 版本。

    运行

    nuget pack yourlibrary.nuspec
    

    打包。

    这将打包目录批发并将其放入 nupkg。错误消息将在此时消失。

    【讨论】:

    • net20net40net45 的支持列表在哪里维护?这些是否只是防止在添加时将程序集包含到旧项目中(而不是将文件放在lib 下)?在构建包时,这个额外的结构通常是手动维护的,还是可以检测和使用 .NET 版本的程序集?
    • @brianary 我相信这个列表在这里:docs.microsoft.com/en-us/nuget/schema/… 这个链接更完整地记录了上述文件夹结构:docs.microsoft.com/en-us/nuget/create-packages/…
    • 这里 net40 显示了构建 File*.dll 的框架??或者您要使用/引用这些 (File*.dll) dll 的项目框架??
    • @gmuhammad 我相信net40表示该项目构建的框架版本。
    【解决方案2】:

    您要引用的任何 dll 都应位于 lib 文件夹下。警告是因为 file1.dll 在 lib 之外,并且在安装包期间将被忽略。 (其他特殊文件夹为“content”和“tools”)

    我用过这个结构:

    Root
      - lib
        - File1.dll
        - File2.dll
        - File3.dll
    

    有关详细信息,请参阅:http://docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#Package_Conventions

    【讨论】:

    • 对不起,什么 lib 文件夹?我一直在关注本教程 (docs.nuget.org/docs/creating-packages/…) 从程序集中创建包,但看不到任何 lib 文件夹 - 只是创建规范文件和 nupkg 文件的命令
    【解决方案3】:

    使用截至本文发布的最新版本的 NuGet(我也假设为更高版本),您可以使用 .csproj 文件和 .nuspec 文件来创建包。我们所做的是制作一个 .nuspec 文件(使用 nuget 规范然后对其进行自定义)并将其包含在项目中。

    使用自定义的 .nuspec 文件,我们使用命令:

    nuget pack sample.csproj -IncludeReferencedProjects
    

    那时它构建了 .nupkg 并且没有发出问题。 .nu​​pkg 文件显示在正常的输出文件夹中(在我的默认情况下,bin\debug)。

    【讨论】:

    • 这是一个糟糕的答案。在使用 nuget 3.3 和您的确切命令的 VS 2015 中,我仍然收到此错误。
    • 它对我有用。我使用“nuget spec”从 *.csproj 文件创建了 *.csproj.nuspec 文件,但没有重命名它。只有当我尝试重命名它时,我才收到错误。
    【解决方案4】:

    您可以通过在 nuspec 文件中添加下面的内部标记来添加对另一个 dll 的引用

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

    【讨论】:

    • 我发现src="../Xxx" ... 不起作用(尽管文档说它应该);但由于src 是相对于BasePath 参数,您可以将BasePath 更改为您要包含的所有文件的根目录。
    • 如果您已经构建了程序集并且只需要打包它们,这将非常有效。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      我使用了 Von Lemongargle 教授的解决方案,对我来说这是一个很好的解决方案。 重要提示:

      1. 在项目中包含规范文件(右键单击->包含在项目中)
      2. 为您的项目提供与您的项目相同的文件名(myproject.csproj、myproject.nuspec)的规范文件

      这在 Visual Studio 2012 中完美运行。

      【讨论】:

      • 项目中必须包含规范文件,这一点很重要
      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多