我创建了一个NuGet包libtidy,该包已推送到Team Services提要。

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



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

  • 删除packages文件夹内的所有文件夹并更新
  • 从提升的命令提示符
  • 中执行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;
    

    编辑3

    编辑3 :

    我是

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

    我有:
    <?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>
    

    最佳答案

    你可能正在得到这个



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

    如果尚未安装,则应考虑手动创建nuget软件包,而不是通过项目或程序集来进行。去做这个:

  • 创建一个名为nuget-libtidy的文件夹
  • 将libtidy.dll,TidyManaged.dll以及您需要的其他任何内容添加到此文件夹
  • 打开cmd并导航到您刚创建的文件夹
  • 运行nuget spec以创建默认 list Package.nuspec(您需要将nuget添加到PATH环境变量
  • 将以下xml添加到刚刚在</metadata>关闭标记之后创建的nuspec文件中
    <files>
        <file src="libtidy.dll" target="content" />
        <file src="TidyManaged.dll" target="lib" />
    </files>
    
  • 调整您需要的任何其他值。

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

    09-06 05:30