.net - 添加 NuGet 包失败

标签 .net visual-studio nuget

我创建了一个 NuGet 包 libtidy ,并将其推送到团队服务源。

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

Failed to add reference to '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 会更好,也许作为 Tidymanagement 安装的一部分,但目前还没有。

编辑2

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;

编辑3

编辑3:

我是

a) 将 libtidy.dllInstall.ps1 放置在 nuget 生成的 list 中名为 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>

最佳答案

你可能会得到这个

Failed to add reference to 'libtidy'

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

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

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

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

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

如果您不希望每个人都必须这样做,您可以对 nuget-libtidy 文件夹和 list 文件进行更多调整。基本上您需要做的是创建一个 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 脚本后,向 list 文件中添加另一行:

<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";

关于.net - 添加 NuGet 包失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37273840/

相关文章:

c# - NuGet 以及处理框架和核心的更新

Java/JRuby on Rails 与 .NET 3.5...感觉我做错了

c# - 将对象传递给 T4 文本模板

C++ 坐标错误

c# - 如何为我的程序设置任务管理器描述?

c# - 升级到 .NET 4.7 后为 "Predefined type System.ValueTuple is not defined or imported"

c# - 在 C# 中访问 F# 可区分联合类型的数据的最简单方法是什么?

.net - 哪个是首选 : Nested If's or Exit Sub/Function?

visual-studio - Visual Studio 2010 "Smudging"

c# - 无法安装 nuget 包 unity 2