Do czego służy plik <None Include = „…”> w pliku .csproj?

137

Jak jest

<None Include="C:\foo.bar" />

różny od

<Content Include="C:\foo.bar" />

?

Emmett
źródło
7
Miałem kilka Contentzmian w Nones. Myślę, że stało się to, kiedy zmieniłem nazwy plików z .ascx na .cshtml podczas konwersji na Razor. Ręczna zmiana ich z powrotem rozwiązała niektóre problemy z wdrażaniem. Cieszę się, że to znalazłem.
Chris,

Odpowiedzi:

135

W artykule MSDN dotyczącym właściwości akcji kompilacji wyjaśniono różnice.

Brak - plik nie jest uwzględniony w grupie wyjściowej projektu i nie jest kompilowany w procesie kompilacji. Przykładem jest plik tekstowy zawierający dokumentację, na przykład plik Readme.

Zawartość - plik nie jest skompilowany, ale znajduje się w grupie wyjściowej Treść. Na przykład to ustawienie jest wartością domyślną dla pliku .htm lub innego rodzaju pliku internetowego.

adrianbanks
źródło
5
Dzięki, miałem problem ze znalezieniem tego odniesienia.
Emmett
Pomocne, ale po co w ogóle mieć element „Brak”, skoro plik nie ma być uwzględniany w wyniku? Jaki jest sens?
JimH44
1
@ JimH44 Elementy <None> są często używane do kopiowania plików do katalogu wyjściowego, mimo że domyślnie nie znajdują się w grupie wyjściowej . Jeśli wybierzesz „Kopiuj do katalogu wyjściowego” -> „Kopiuj zawsze” dla pliku <Brak>, spowoduje to skopiowanie go i zobaczysz, że wpis dodany do pliku .csproj projektu będzie miał wpis <Brak> dla pliku.
Conspicuous Compiler
3
Zatem jaka jest różnica między plikiem <Brak> z opcją „Kopiuj do katalogu wyjściowego” -> „Zawsze kopiuj” a plikiem <Content> z plikiem „Kopiuj do katalogu wyjściowego” -> „Zawsze kopiuj”?
hashtable
30

Jedna różnica polega na sposobie ich publikacji; Elementy „Brak” nie są uwzględniane w publikacji, elementy „Treść” tak. na przykład w oknie dialogowym „Pliki aplikacji” na karcie Publikuj.

Marc Gravell
źródło
8
Nie prawda. Przynajmniej w nowym kliencie dot net cli. jeśli masz element zadeklarowany jako Brak z CopyToOutputDirectoryustawionym na trueto, zostanie opublikowany wdotnet publish
disklosr
13

Nie jestem pewien w 100% (przeczytałem opis właściwości Build Action w witrynie MSDN ), ale samo skopiowanie tej odpowiedzi z MSDN do StackOverflow nie odpowiada mi całkowicie na to pytanie.

Różnica między brakiem a treścią ma wpływ tylko na projekty internetowe. Dla projektu wiersza poleceń, projektu WinForm lub projektu UnitTest (w moim przypadku) itp. None i Content nie mają innego zachowania.

MSDN: „grupa wyjściowa projektu” lub „grupa wyjściowa treści” tylko terminy używane w projekcie sieci Web, prawda?

hfrmobile
źródło
2
Jak mówisz, wydaje się Nonevs Contentma wpływ tylko na krok publikacji, a nie na krok kompilacji . Wydaje się, że krok kompilacji CopyToOutputDirectorymożna ustawić na albo i to kontroluje, czy plik jest kopiowany przez krok kompilacji. Wydaje się również dziwne, że domyślnie szablony T4 są dodawane jako Contentelementy, a nie Noneelementy.
Christopher King
8

W mojej sytuacji mój plik MSBuild zawierał ItemGroupzasoby obrazu, które wyglądały następująco:

  <ItemGroup>
    <Content Include="Resources\image001.png" />
    <Content Include="Resources\image002.png" />
    <Content Include="Resources\image003.png" />
    <Content Include="Resources\image004.png" />
    <None Include="Resources\image005.png" />
    <None Include="Resources\image006.png" />
    <None Include="Resources\image007.png" />
  </ItemGroup>

Podczas gdy mój projekt był w porządku, zacząłem się zastanawiać, dlaczego mam w sobie mieszankę elementów Contenti Nonetypów elementów ItemGroup. Ten artykuł MSDN (dotyczący programu Visual Studio 2010) dał mi wskazówki, których szukałem:

Zauważ, że kiedy edytor zasobów dodaje obraz, ustawia Build Action na None , ponieważ plik resx odwołuje się do pliku obrazu. W czasie kompilacji obraz jest pobierany do pliku Resources utworzonego z pliku resx. Obraz można następnie łatwo uzyskać za pomocą automatycznie wygenerowanej klasy o jednoznacznie określonym typie dla pliku resx. Dlatego nie należy zmieniać tego ustawienia na zasób osadzony , ponieważ spowodowałoby to dwukrotne uwzględnienie obrazu w zestawie.

Rozwiązanie: dzięki tym wskazówkom za pomocą edytora tekstu zmieniłem Contentelementy typu elementu na None.

Aby zapoznać się z omówieniem elementów programu MSBuild, zobacz ten artykuł MSDN .

DavidRR
źródło
3

Mam projekt, który nie zawiera żadnych elementów do kompilacji (przechowuje html i javascript dla testów jednostkowych jaśminu).

Pewnego dnia moje rozwiązanie (które zawierało wspomniany projekt) przestało się kompilować, mówiąc: „Element docelowy„ Build ”nie istnieje w projekcie”.

Dodałem import, aby wprowadzić kompilator, który działał dobrze na moim komputerze, ale nie udało się użyć msbuild na serwerze kompilacji.

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Następnie zmieniłem linię z

<None Include="SpecRunner.html" />

do

<Content Include="SpecRunner.html" />

i działał również na serwerze kompilacji.

cedd
źródło
2

Nie potrzebujesz Brak w pliku projektu szablonu, aby uwzględnić pliki zdefiniowane w .vstemplate, w przeciwnym razie zostaną one utracone w procesie tworzenia i tłumaczenia. Zostają pozostawione w folderze tymczasowym, którego używa do zbudowania wszystkiego, a następnie wkrótce zostaną usunięte.

Facet z CAD
źródło
1

W moim przypadku .Pubxml jest jednym z tych plików na liście Brak . Nie jest przeznaczony do tworzenia rozwiązań ani jako plik statyczny do projektu internetowego. Jednak aby opublikować witrynę na platformie Azure, konfiguracje są obecne w tym.

Zgodnie z artykułem firmy Microsoft są to główne typy, które widzimy wśród tagów plików .csproj :

Brak - plik nie jest uwzględniony w grupie wyjściowej projektu i nie jest kompilowany w procesie kompilacji. Przykładem jest plik tekstowy zawierający dokumentację, na przykład plik Readme.

Kompiluj - plik jest kompilowany do danych wyjściowych kompilacji. To ustawienie jest używane dla plików kodu.

Zawartość - plik nie jest skompilowany, ale znajduje się w grupie wyjściowej Treść. Na przykład to ustawienie jest wartością domyślną dla pliku .htm lub innego rodzaju pliku internetowego.

Zasób osadzony - ten plik jest osadzony w danych wyjściowych kompilacji głównego projektu jako plik DLL lub plik wykonywalny. Zwykle jest używany w przypadku plików zasobów.

krishna kanth
źródło
1
Proszę o komentarz tutaj, jeśli coś jest mylące lub niejasne, samo głosowanie negatywne nie pomoże mi lepiej tego poprawić. Z góry dziękuję.
krishna kanth,
1
Często pojawia się błąd: nazwa elementu „None” dla include „Properties \ PublishProfiles \ FolderProfile.pubxml” powinna mieć wartość „Content”. w moim projekcie Asp.Net na Bamboo i czasami ponownie uruchomię kompilację, aby po prostu to naprawić, więc nie wiem, na czym dokładnie polega problem
Bochen Lin
Cześć @BochenLin, szczegóły, o których tu wspomniałeś, są trochę skąpe. Możesz spróbować podać więcej szczegółów tutaj lub opublikować nowe pytanie z pełnymi szczegółami problemu i zrzutem ekranu, jeśli to możliwe [a następnie udostępnij link do pytania tutaj].
krishna kanth
0

Pliki zawartości nie są zawarte w kompilacji, ale są uwzględniane w publikacji.

Żadne pliki nie są uwzględniane w kompilacji ani publikowaniu, chyba że zostały skonfigurowane w ten sposób przez Ciebie. Na przykład ustawienie „Kopiuj do katalogu wyjściowego” na „Zawsze” lub „Nowsze” spowoduje, że zostaną one uwzględnione zarówno w kompilacji, jak i w publikacji.

carlin.scott
źródło