Элемент nuget 'packages' не объявлен предупреждением

142

не showstopper, но при использовании nuget в проекте он создает файл packages.config с этой формой

<?xml version="1.0" encoding="utf-8"?>
<packages>
   ... your packages
</packages> 

это дает предупреждение в VS

The 'packages' element is not declared.

Я думаю, причина проблемы связана с объявлением xml.

Также я думаю, что пакет определений по умолчанию не должен выдавать предупреждений.

Кто-нибудь знает, на что мне его заменить, чтобы я не получал этого предупреждения? (т.е. даже если я вижу его только тогда, когда файл открыт, он также постоянно отображается как предупреждение с включенными определенными правилами CA).

круглый кризис
источник
3
Я нашел [это решение] [1] для этой темы, и я думаю, что это лучше. [1]: stackoverflow.com/questions/2833243/…
Марио Лопес
1
tbh реальное решение - добавить официальную схему ... пожалуйста, посмотрите мой ответ ниже
Stefan Z Camilleri
Вот соответствующая проблема на github: github.com/NuGet/Home/issues/1836
dimaaan

Ответы:

96

Вы всегда можете создать простую схему xsd для 'packages.config', чтобы избавиться от этого предупреждения. Для этого создайте файл с именем «packages.xsd»:

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
      targetNamespace="urn:packages" xmlns="urn:packages">
  <xs:element name="packages">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="package" maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="id" type="xs:string" use="required" />
            <xs:attribute name="version" type="xs:string" use="required" />
            <xs:attribute name="targetFramework" type="xs:string" use="optional" />
            <xs:attribute name="allowedVersions" type="xs:string" use="optional" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Расположение этого файла (два варианта)

  • В той же папке, что и файл packages.config,
  • Если вы хотите поделиться packages.xsdнесколькими проектами, переместите его в папку схем Visual Studio (путь может немного отличаться, это D:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemas для меня).

Затем отредактируйте <packages>тег в packages.configфайле (добавьте xmlnsатрибут):

<packages xmlns="urn:packages">

Теперь предупреждение должно исчезнуть (даже если файл packages.config открыт в Visual Studio).

Лукаш Виатрак
источник
1
Разве вам не нужно изменять вторую строку XSL: <xs: schema xmlns: xs = " w3.org/2001/XMLSchema " targetNamespace = "urn: packages" xmlns = "urn: packages">
Ури,
1
Вы знаете, почему Visual Studio не создает этот файл xsd?
Андерс Линден,
1
u пропустил targetFrameworkатрибут в файле схемы xml. Я получаю сообщение об ошибкеtargetFramework attribute is not defined
шашват
2
Я обнаружил, что при использовании вашего решения с entity framework консоль NuGet не могла правильно проанализировать мой package.config и продолжала сообщать мне, что пакет EnitityFramework не был установлен в моем проекте. Я использую EF 6.1.0 с NuGet 2.8.50313.46 в окончательном обновлении
VS2013
7
Это решение нарушает автоматическую установку отсутствующих пакетов в vs2012 / nuget. Предупреждение исчезло, но мне потребовалось несколько часов, чтобы выяснить, почему vs2012 больше не устанавливает недостающие пакеты. Итак, лучшее решение (ответ в stackoverflow.com/questions/2833243/… ) - создать схему через меню XML -> Создать схему (vs 2012 автоматически добавит ее в список используемых схем) - нет необходимости изменять. config, никаких перерывов в других функциях
outofmind
188

Вы увидите это только тогда, когда файл открыт. Когда вы закроете файл в Visual Studio, предупреждения исчезнут

http://nuget.codeplex.com/discussions/261638

Цви Григорий Кайданов
источник
8
Ха, игнорирование проблемы заставляет ее уйти: D. Но может ли то, что ты не видишь, ранить тебя?
JSideris
5
правильно @gregory, мы должны игнорировать это .. есть другие последствия этого предупреждения. Он создан nugetи nugetочень хорошо знает, как использовать этот файл.
шашват
Да, это должен быть принятый ответ. Вышеупомянутая - одна из причин, по которой мне приходится носить парик на работе.
neilhighley 07
@neilhighley Спасибо, ребята. Не совсем помню проблему, но рад, что смог помочь. LOL
Цви Григорий Кайданов
@RyanRodemoyer Спасибо, ребята. Не совсем помню проблему, но рад, что смог помочь. LOL
Цви Григорий Кайданов
116

На самом деле правильный ответ - просто добавить схему в ваш документ, например

<packages xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">

...и вы сделали :)

Если XSD еще не кэширован и недоступен, вы можете добавить его из консоли NuGet следующим образом.

Install-Package NuGet.Manifest.Schema -Version 2.0.0

Как только это будет сделано, как указано в комментарии ниже, вы можете переместить его из вашей текущей папки в официальную папку схемы, которая находится в

%VisualStudioPath%\Xml\Schemas
Стефан З. Камиллери
источник
Почему я не могу перейти по этому URL?
andrewb
4
Вы правы, говоря, что рассматриваемый xsd в настоящее время недоступен, что, по их определению W3C, как бы вводило в заблуждение, объявление xmlns (пространство имен) - это не более чем строка в форме URI, и не требуется и не предполагается, что ресурс действительно доступен там ( en.wikipedia.org/wiki/XML_namespace )
Stefan Z Camilleri
1
Да уж точно, это сам xsd. Visual Studio на самом деле не проверяет схему, это библиотека / сборка, использующая XML-документ, будет выполнять проверку. Единственная причина, по которой VS нужна эта информация, - предоставить intellisense. Когда ресурс не может быть найден, VS может использовать предварительно кэшированный экземпляр xsd, который можно найти в% VsInstallDir% \ xml \ Schemas
Стефан З. Камиллери
4
Итак, теперь я получаю 13 информационных сообщений («Не удалось найти информацию о схеме ...») вместо одного предупреждающего сообщения ... вроде как шаг назад :-)
Ригардт Стейн
1
Следует отметить, что недавно у меня возникли проблемы с добавлением этих пространств имен, которые мешали NuGet. К сожалению, я предпочитаю не получать предупреждений.
meh-uk
7

Ни один из ответов не решит вашу проблему навсегда. Если вы перейдете по пути добавления XSD (в меню Xml выберите «Создать схему»), у вас возникнут проблемы с диспетчером пакетов, поскольку он очистит ваш файл packages.config при добавлении нового пакета.

Лучшее решение - просто игнорировать, закрыв файл, когда вы его не используете.

Барис
источник
+1; просто имейте в виду, что это тоже работает (и не нарушит работу диспетчера пакетов).
rsenna
5

Проблема в том, что вам нужна xsd-схема для packages.config .

Вот как вы можете создать схему ( я нашел ее здесь) :

Откройте файл конфигурации -> XML -> Создать схему

введите описание изображения здесь

Это создаст packages.xsdдля вас и откроет его в Visual Studio:

введите описание изображения здесь

В моем случае, packages.xsd был создан по этому пути:

C: \ Users \ MyUserName \ AppData \ Local \ Temp

Теперь я не хочу ссылаться на packages.xsdфайл из папки Temp, но я хочу, чтобы он был добавлен в мое решение и добавлен в систему управления версиями, чтобы другие пользователи могли его получить ... поэтому я скопировалpackages.xsd и вставил его в папку своего решения. Затем я добавил файл в свое решение:

1. Скопируйте packages.xsdв ту же папку, что и ваше решение.

2. В VS щелкните правой кнопкой мыши решение -> Добавить -> Существующий элемент ... и затем добавьтеpackages.xsd

введите описание изображения здесь

Итак, теперь мы создали packages.xsdи добавили его в Решение. Все, что нам нужно сделать, это указать конфигурационному файлу использовать эту схему.

Откройте файл конфигурации, затем в верхнем меню выберите:

XML -> Схемы ...

Добавьте свой packages.xsdи выберите Использовать эту схему (см. Ниже)

введите описание изображения здесь

Hooman Bahreini
источник
4

Это происходит потому, что VS не знает схему этого файла. Обратите внимание, что этот файл представляет собой скорее деталь реализации, а не то, что вам обычно нужно открывать напрямую. Вместо этого вы можете использовать диалоговое окно NuGet для управления пакетами, установленными в проекте.

Дэвид Эббо
источник
Неважно, что вы используете NuGet для установки пакетов. Создается тот же файл `packages.config ', но он по-прежнему генерирует это предупреждение компилятора.
ProfK
0

Это работает и остается даже после добавления нового пакета:

Добавьте следующий! DOCTYPE над элементом <packages>:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE packages [
  <!ELEMENT packages (package*)>
  <!ELEMENT package EMPTY>
  <!ATTLIST package
  id CDATA #REQUIRED
  version CDATA #REQUIRED
  targetFramework CDATA #REQUIRED
  developmentDependency CDATA #IMPLIED>
]>
chuckc
источник