Element nuget „packages” nie jest zadeklarowany jako ostrzeżenie

142

nie jest to showstopper, ale podczas używania nuget w projekcie tworzy plik packages.config z tym kształtem

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

to daje ostrzeżenie w VS

The 'packages' element is not declared.

Myślę, że pochodzenie problemu ma coś wspólnego z deklaracją XML.

Myślę też, że domyślny pakiet definicji nie powinien generować ostrzeżeń.

Czy ktoś wie, na co mam to zmienić, żeby nie dostać tego ostrzeżenia? (tj. nawet jeśli widzę go tylko wtedy, gdy plik jest otwarty, wyświetla się również jako ostrzeżenie przy włączonych pewnych regułach urzędu certyfikacji).

okrągły kryzys
źródło
3
Znalazłem [to rozwiązanie] [1] na ten temat, które moim zdaniem jest lepsze. [1]: stackoverflow.com/questions/2833243/…
Mario Lopez
1
tbh prawdziwym rozwiązaniem jest dodanie oficjalnego schematu ... proszę zobaczyć moją odpowiedź poniżej
Stefan Z Camilleri
Tutaj jest odpowiedni numer na github: github.com/NuGet/Home/issues/1836
dimaaan

Odpowiedzi:

96

Zawsze możesz utworzyć prosty schemat xsd dla „packages.config”, aby pozbyć się tego ostrzeżenia. Aby to zrobić, utwórz plik o nazwie „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>

Lokalizacja tego pliku (dwie opcje)

  • W tym samym folderze, co plik „packages.config”,
  • Jeśli chcesz udostępnić packages.xsdw wielu projektach, przenieś go do folderu Schematy programu Visual Studio (ścieżka może się nieznacznie różnić, to D:\Program Files (x86)\Microsoft Visual Studio 10.0\Xml\Schemasdla mnie).

Następnie edytuj <packages>tag w packages.configpliku (dodaj xmlnsatrybut):

<packages xmlns="urn:packages">

Teraz ostrzeżenie powinno zniknąć (nawet jeśli plik packages.config jest otwarty w Visual Studio).

Łukasz Wiatrak
źródło
1
Nie musisz modyfikować drugiej linii XSL: <xs: schema xmlns: xs = " w3.org/2001/XMLSchema " targetNamespace = "urn: packages" xmlns = "urn: packages">
Uri
1
Czy wiesz, dlaczego program Visual Studio nie tworzy tego pliku xsd?
Anders Lindén
1
brak targetFrameworkatrybutu u w pliku schematu xml. Otrzymuję błądtargetFramework attribute is not defined
shashwat,
2
Zauważyłem, że używając Twojego rozwiązania ze strukturą jednostek, konsola NuGet nie mogła poprawnie przeanalizować mojego pliku package.config i ciągle informowała mnie, że pakiet EnitityFramework nie został zainstalowany w moim projekcie. Używam EF 6.1.0 z NuGet 2.8.50313.46 w VS2013 Ultimate Update 2.
misterfrb
7
To rozwiązanie przerywa automatyczną instalację brakujących pakietów funkcji w vs2012 / nuget. Ostrzeżenie zniknęło, ale kosztowało mnie wiele godzin, aby dowiedzieć się, dlaczego vs2012 nie instaluje już brakujących pakietów. Więc lepszym rozwiązaniem (odpowiedź w stackoverflow.com/questions/2833243/ ... ) jest utworzenie schematu poprzez menu XML -> Utwórz schemat (w porównaniu z 2012 automatycznie doda go do listy używanych schematów) - nie ma potrzeby zmiany pliku. config, bez przerwy w innych funkcjach
outofmind
188

Zobaczysz to tylko wtedy, gdy plik jest otwarty. Po zamknięciu pliku w programie Visual Studio ostrzeżenia znikną

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

Cwi Gregory Kaidanov
źródło
8
Ha, ignorowanie problemu sprawia, że ​​zniknie: D. Ale czy to, czego nie widzisz, może cię zranić?
JSideris
5
prawo @gregory powinniśmy to zignorować .. to ostrzeżenie ma inny wpływ. Jest ona generowana przez nugeti nugetwie, jak się do tego pliku bardzo dobrze.
shashwat
Tak, to powinna być akceptowana odpowiedź. Ten powyżej jest jednym z powodów, dla których muszę nosić perukę w pracy.
neilhighley
@neilhighley Dzięki chłopaki. Nie pamiętam problemu, ale cieszę się, że mogłem pomóc. LOL
Cwi Gregory Kaidanov
@RyanRodemoyer Thanks guys. Nie pamiętam problemu, ale cieszę się, że mogłem pomóc. LOL
Cwi Gregory Kaidanov
116

Właściwie poprawną odpowiedzią na to jest po prostu dodanie schematu do dokumentu, w ten sposób

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

...i jesteś skończony :)

Jeśli XSD nie jest jeszcze buforowany i niedostępny, możesz dodać go w następujący sposób z konsoli NuGet

Install-Package NuGet.Manifest.Schema -Version 2.0.0

Gdy to zrobisz, jak zaznaczono w komentarzu poniżej, możesz przenieść go z bieżącego folderu do oficjalnego folderu schematu, który znajduje się w

%VisualStudioPath%\Xml\Schemas
Stefan Z Camilleri
źródło
Dlaczego nie mogę przejść do tego adresu URL?
andrewb
4
Masz rację, mówiąc, że omawiany xsd nie jest obecnie dostępny, co powiedziawszy, zgodnie z definicją W3C, choć może to być mylące, deklaracja xmlns (przestrzeni nazw) jest niczym innym jak ciągiem znaków w postaci identyfikatora URI i nie jest wymagane, ani sugerowane, aby zasoby były tam rzeczywiście dostępne ( en.wikipedia.org/wiki/XML_namespace )
Stefan Z Camilleri,
1
Tak, zdecydowanie jest to sam xsd. Visual Studio tak naprawdę nie weryfikuje schematu, to biblioteka / zestaw konsumuje dokument XML, który przeprowadza walidację. Jedynym powodem, dla którego VS potrzebuje tych informacji, jest zapewnienie inteligencji. Gdy nie można znaleźć zasobu, VS może używać wstępnie buforowanej instancji xsd, którą można znaleźć w% VsInstallDir% \ xml \ Schemas
Stefan Z Camilleri
4
Więc teraz otrzymuję 13 wiadomości informacyjnych ("Nie można znaleźć informacji o schemacie ...") zamiast tylko jednego Komunikat ostrzegawczy ... to trochę jak krok wstecz :-)
Riegardt Steyn
1
Warto zauważyć, że ostatnio miałem problemy z dodaniem tych przestrzeni nazw, które zepsuły NuGet. Szkoda, bo wolę nie otrzymywać ostrzeżeń.
meh-uk,
7

Żadna z odpowiedzi nie rozwiąże Twojego problemu na stałe. Jeśli przejdziesz do ścieżki dodawania XSD (z menu Xml wybierz "Utwórz schemat"), będziesz miał problemy z menedżerem pakietów, ponieważ wyczyści on twój plik packages.config po dodaniu nowego pakietu.

Najlepszym rozwiązaniem jest po prostu zignorowanie i zamknięcie pliku, gdy go nie używasz.

Baris
źródło
+1; pamiętaj tylko, że to również działa (i nie zepsuje menedżera pakietów).
rsenna
5

Problem w tym, że potrzebujesz schematu xsd dla packages.config.

Oto jak możesz stworzyć schemat ( znalazłem go tutaj) :

Otwórz plik konfiguracyjny -> XML -> Utwórz schemat

wprowadź opis obrazu tutaj

Spowoduje to utworzenie packages.xsddla Ciebie i otwarcie go w programie Visual Studio:

wprowadź opis obrazu tutaj

W moim przypadku packages.xsdpowstał pod tą ścieżką:

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

Teraz nie chcę odwoływać się packages.xsddo folderu Temp, ale chcę, aby został dodany do mojego rozwiązania i dodany do kontroli źródła, aby inni użytkownicy mogli go pobrać ... więc skopiowałem go packages.xsdi wklejiłem do folderu mojego rozwiązania. Następnie dodałem plik do mojego rozwiązania:

1. Skopiuj packages.xsddo tego samego folderu, w którym znajduje się rozwiązanie

2. W VS, kliknij prawym przyciskiem myszy rozwiązanie -> Dodaj -> Istniejący element ..., a następnie dodajpackages.xsd

wprowadź opis obrazu tutaj

Więc teraz stworzyliśmy packages.xsdi dodaliśmy go do rozwiązania. Wszystko, co musimy zrobić, to powiedzieć plikowi konfiguracyjnemu, aby używał tego schematu.

Otwórz plik konfiguracyjny, a następnie z górnego menu wybierz:

XML -> Schematy ...

Dodaj swój packages.xsdi wybierz Użyj tego schematu (patrz poniżej)

wprowadź opis obrazu tutaj

Hooman Bahreini
źródło
4

Dzieje się tak, ponieważ VS nie zna schematu tego pliku. Zauważ, że ten plik jest bardziej szczegółowym opisem implementacji, a nie czymś, co zwykle musisz otwierać bezpośrednio. Zamiast tego możesz użyć okna dialogowego NuGet do zarządzania pakietami zainstalowanymi w projekcie.

David Ebbo
źródło
Nie ma znaczenia, że ​​używasz NuGet do instalowania pakietów. Ten sam plik `packages.config 'jest budowany i nadal generuje to ostrzeżenie kompilatora.
ProfK
0

To działa i pozostaje nawet po dodaniu nowego pakietu:

Dodaj następujący tekst! DOCTYPE nad elementem <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
źródło