【问题标题】:Failed to add NuGet package添加 NuGet 包失败
【发布时间】:2016-05-17 10:42:23
【问题描述】:

我创建了一个 NuGet 包 libtidy,它被推送到团队服务源。

当我尝试通过 NuGet 控制台安装时出现错误

未能添加对“libtidy”的引用

我已阅读此Stack Overflow post,其中 OP 有类似的问题,但我无法解决问题 - 我已经尝试过:

  • 删除包文件夹内的所有文件夹并更新
  • 从提升的命令提示符处执行 regsvr32 "C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VsLangproj.olb"
  • 从包管理器控制台执行Uninstall-Package libtidy -force(这不起作用,因为未安装包
  • git clean -dfx
  • 清除 nuget 缓存
  • 手动删除.nuget目录下的libtidy目录

编辑

做了一些研究,这可能与 libtidy.dll 不是托管代码有关吗?事实上它是ANSI-C。在我们的应用程序中,我们使用 TidyManaged 作为包装器,它是托管的,并通过 nuget 成功安装。目前,如果我们手动将 libtidy.dll 复制到 bin 中,它可以正常工作,但如果构建过程将 libtidy.dll 拉入会更好,也许作为 Tidymanaged 安装的一部分,它目前没有。

EDIT2

param($installPath, $toolsPath, $package, $project)

$file = $project.ProjectItems.Item("libtidy.dll");

If ($file -eq $null)
{
     $project.ProjectItems.AddFromFile("libtidy.dll");
     $file = $project.ProjectItems.Item("libtidy.dll");
}

$file.Properties.Item("CopyToOutputDirectory").Value = [int]1;

EDIT3

编辑 3

我是

a) 将libtidy.dllInstall.ps1 放在nuget spec 生成的清单中名为nuget-libtidy 的目录中

我有:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>nuget-libtidy</id>
    <version>1.0.0</version>
    <authors>Name</authors>
    <owners>Name</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>nuget-libtidy</description>
    <copyright>Copyright 2016</copyright>
    <tags>nuget-libtidy</tags>
  </metadata>
  <files>
      <file src="libtidy.dll" target="content" />
      <file src="Install.ps1" target="tools" />
  </files>
</package>

当我运行 nuget pack 时,我收到以下警告:

WARNING: 1 issue(s) found with package 'nuget-libtidy2'.

Issue: Assembly outside lib folder.
Description: The assembly 'content\libtidy.dll' is not inside the 'lib' folder and hence it won't be added as reference when the package is installed into a project.
Solution: Move it into the 'lib' folder if it should be referenced.

b) 当我们构建应用程序时,libtidy.dll 被放置在项目的根目录(不是 bin)& 在输出窗口中得到以下错误:

Added package 'nuget-libtidy' to 'packages.config'
Executing script file <path>\nuget-libtidy\tools\Install.ps1'...
Cannot add a link to the file libtidy.dll. There is already a file of the same name in this folder.
At <path>\nuget-libtidy\tools\Install.ps1:7 char:5
+     $project.ProjectItems.AddFromFile("libtidy.dll");
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], COMException
    + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException

Successfully installed 'nuget-libtidy' to <Namepace>

【问题讨论】:

  • 请提供你的vs版本,什么是Service Pack?

标签: .net visual-studio nuget


【解决方案1】:

你可能会得到这个

未能添加对“libtidy”的引用

因为您在 lib 文件夹中的某处有 libtidy。在此文件夹中安装包会自动添加引用,您不能直接添加对非托管库的引用。

如果您还没有,您应该考虑手动创建您的 nuget 包,而不是通过项目或程序集来创建。为此:

  1. 创建一个名为 nuget-libtidy 的文件夹
  2. 将 libtidy.dll、TidyManaged.dll 和您需要的任何其他内容添加到此文件夹中
  3. 打开 cmd 并导航到您刚刚创建的文件夹
  4. 运行 nuget spec 以创建默认清单 Package.nuspec(您需要将 nuget 添加到您的 PATH 环境变量中
  5. &lt;/metadata&gt;结束标记之后将以下xml添加到刚刚创建的nuspec文件中

    <files>
        <file src="libtidy.dll" target="content" />
        <file src="TidyManaged.dll" target="lib" />
    </files>
    
  6. 调整您需要的任何其他值。

您可以将其称为完成并打包和部署 nuget 包。您需要将 libtidy.dll 复制到输出目录。这意味着在安装包后,您必须导航到在 Visual Studio 中右键单击 dependencies\libtidy.dll,选择属性并将 Copy to Output Directory 设置为 Copy Always

如果您不希望每个人都必须这样做,您可以对您的 nuget-libtidy 文件夹和清单文件进行更多调整。基本上你需要做的是创建一个 Install.ps1 文件,添加

<ItemGroup>
    <Content Include="libtidy.dll">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
</ItemGroup>

到已安装项目的项目文件。

这是一个 Install.ps1 的示例,它应该可以满足您的需求:

param($installPath, $toolsPath, $package, $project)

$file = $project.ProjectItems.Item("libtidy.dll");

If ($file -eq $null)
{
    $project.ProjectItems.AddFromFile("libtidy.dll");
    $file = $project.ProjectItems.Item("libtidy.dll");
}

$file.Properties.Item("CopyToOutputDirectory").Value = [int]1;

完成 PowerShell 脚本后,在清单文件中添加另一行:

<file src="Install.ps1" target="tools" />

不要忘记在 Windows 10 上运行脚本需要您设置执行策略。我建议运行Set-ExecutionPolicy RemoteSigned。在 PowerShell 中运行此程序后,您必须重新启动系统。

此时,您应该可以打包和部署了。

编辑

在 Install.ps1 文件中发现错字。第 3 行,$file1 = $project.ProjectItems.Item("libtidy.dll"); 应该是 $file = $project.ProjectItems.Item("libtidy.dll";

【讨论】:

  • 感谢您提供如此全面的答案。会试一试的。
  • 我们发现它是将“libtidy.dll”复制到根目录而不是“bin”文件夹。有什么想法吗?
  • tools 文件夹下的软件包中的 install.ps1 文件应该已经开始在每次构建时将文件复制到 bin。你能检查一下 libtidy.dll 的属性,让我知道“复制到输出目录”的值是什么
  • 设置为“不复制”。感谢您迄今为止的帮助。
  • 以上可能有混淆。以上与原始dll有关的是它起作用的原始解决方案。我在上面的 EDIT2 中添加了我的 install.ps1 代码
【解决方案2】:

我曾经遇到过类似的问题,我必须以提升的权限运行 VS 才能安装 nuget 包。与我们的公司安全设置有关。

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多