2016-05-17 5 views
5

Я создал пакет NuGet libtidy, который помещается в фид Team Services.Не удалось добавить пакет NuGet

При попытке установки через консоль NuGet я получаю ошибку

Не удалось добавить ссылку на «libtidy»

Я прочитал это Stack Overflow post где OP имеет подобную проблему, но я не смогли решить эту проблему - я пробовал:

  • Удаление всех папок внутри папки пакетов и обновления
  • Выполнение regsvr32 "C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\VsLangproj.olb" из командной строки с повышенными
  • Doing Uninstall-Package libtidy -force из консоли менеджера пакетов (это не работает, поскольку пакет не установлен
  • git clean -dfx
  • кэш клиринг NuGet
  • вручную удаляя libtidy каталог в .nuget каталоге

EDIT

Имея сделал небольшое исследование, может ли это быть связано с тем, что libtidy.dll не управляется кодом? Infact это ANSI-C. В нашем приложении мы используем TidyManaged, как оболочку, которая управляется и успешно устанавливается через nuget. В настоящее время, если мы вручную скопируем файл libtidy.dll в bin, он отлично работает, но было бы лучше, если бы процесс сборки вытащил в libtidy.dll, возможно, как часть Tidymanaged install, которого нет в настоящее время.

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

Edit 3:

Я

а) размещения libtidy.dll и Install.ps1 в директории под названием nuget-libtidy в манифесте, порожденный 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. 

б) Когда мы строим приложение libtidy.dll помещается в корневой каталог проекта (не в ящике) & получить следующее сообщение об ошибке в окне вывода:

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> 
+0

Укажите, пожалуйста, версию vs и что такое пакет обновления? – toha

ответ

4

Вы, вероятно, получить этот

Не удалось добавить ссылку на 'libtidy'

, потому что у вас есть libtidy где-то внутри Lib папки. При установке пакета в этой папке автоматически добавится ссылка, и вы не сможете напрямую добавить ссылку на неуправляемую библиотеку.

Если вы еще этого не сделали, вы должны вручную изучить свой пакет nuget, а не выполнять его по проекту или сборке. Для этого:

  1. Создайте папку под названием NuGet-libtidy
  2. Добавить libtidy.dll, TidyManaged.dll и все остальное, что нужно в этой папке
  3. Открыть cmd и перейдите к только что созданной папке
  4. Run nuget spec для создания по умолчанию манифест 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 скопировать в выходной каталог. Это означает, что после установки пакета вам придется перейти к щелчку правой кнопкой мыши по зависимостям \ 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 вам придется перезагрузить систему.

На данный момент вы должны быть в состоянии упаковать и развернуть.

EDIT

Опечатка найдены в Install.ps1 файле.Строка 3, $file1 = $project.ProjectItems.Item("libtidy.dll"); должна быть $file = $project.ProjectItems.Item("libtidy.dll";

+0

Спасибо за этот весьма исчерпывающий ответ. Попробует. – SamJolly

+0

Мы обнаружили, что оно копирует «libtidy.dll» в корневой каталог, а не в папку «bin». Есть идеи? – SamJolly

+0

Файл install.ps1, который входит в пакет в папке с инструментами, должен был скопировать файл в корзину в каждой сборке. Вы можете проверить свойства libtidy.dll и сообщить мне, что это значение для 'copy to output directory' –

0

У меня когда-то была проблема, с которой мне приходилось запускать VS с повышенным разрешением на установку пакета nuget. Что-то общее с нашими корпоративными настройками безопасности.

+0

Спасибо за вклад. – SamJolly

Смежные вопросы