Em um arquivo .csproj, para que serve <None Include = "…">?

137

Como é

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

diferente de

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

?

Emmett
fonte
7
Eu tive alguns Contents mudados para Nones. Acho que aconteceu quando renomeei arquivos de .ascx para .cshtml ao converter para o Razor. Mudá-los novamente corrigiu manualmente alguns problemas de implantação. Ainda bem que encontrei isso.
24411 Chris

Respostas:

135

O artigo MSDN na propriedade build action explica as diferenças.

Nenhum - o arquivo não está incluído no grupo de saída do projeto e não é compilado no processo de construção. Um exemplo é um arquivo de texto que contém documentação, como um arquivo Leiame.

Conteúdo - O arquivo não é compilado, mas está incluído no grupo de saída Conteúdo. Por exemplo, essa configuração é o valor padrão para um arquivo .htm ou outro tipo de arquivo da Web.

adrianbanks
fonte
5
Obrigado, tive problemas para localizar esta referência.
Emmett
Útil, mas por que ter um item "Nenhum", se o arquivo não deve ser incluído na saída? Qual é o objetivo?
JimH44
1
@ JimH44 <Nenhum> itens costumam ser usados ​​para copiar especificamente arquivos no diretório de saída, mesmo que não estejam no grupo de saída por padrão . Se você selecionar "Copiar para diretório de saída" -> "Copiar sempre" para um arquivo <Nenhum>, isso fará com que ele seja copiado e você verá a entrada adicionada ao arquivo .csproj do projeto e terá uma entrada <Nenhum> para o arquivo
Compilador conspícuo
3
Então, qual é a diferença entre um arquivo <Nenhum> com "Copiar para diretório de saída" -> "Copiar sempre" e um arquivo <Conteúdo> com "Copiar para diretório de saída" -> "Copiar sempre"?
hashtable
30

Uma diferença é como eles são publicados; Os itens "Nenhum" não são incluídos em uma publicação, os itens "Conteúdo"; por exemplo, na caixa de diálogo "Arquivos de aplicativos" na guia Publicar.

Marc Gravell
fonte
8
Não é verdade. Pelo menos no novo ponto net cli. se você tiver um item declarado como Nenhum com um CopyToOutputDirectoryconjunto para trueele vai ser publicado em umdotnet publish
disklosr
13

Não tenho 100% de certeza (li a descrição do MSDN da propriedade Build Action ), mas apenas copiar essa resposta do MSDN para o StackOverflow não responde a pergunta completamente para mim.

A diferença de Nenhum e Conteúdo apenas afeta os projetos da Web. Para um projeto de linha de comando, projeto WinForm ou projeto UnitTest (no meu caso) etc. Nenhum e Conteúdo têm um comportamento diferente.

MSDN: "grupo de saída do projeto" ou "grupo de saída de conteúdo" apenas termos usados ​​em um projeto da Web, certo?

hfrmobile
fonte
2
Como você diz, parece que o Nonevs Contentapenas tem efeito na etapa de publicação e não na etapa de compilação . Para a etapa de compilação, parece que CopyToOutputDirectorypode ser definido em qualquer uma delas e que controla se o arquivo é copiado pela etapa de compilação. Também parece estranho que, por padrão, os modelos T4 sejam adicionados como Contentitens e não Noneitens.
Christopher King
8

Na minha situação, meu arquivo MSBuild tinha um ItemGrouppara recursos de imagem que apareceram da seguinte maneira:

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

Enquanto meu projeto estava construindo bem, isso deixou-me perguntando por que eu tinha uma mistura de Contente Noneelementos do tipo de item na minha ItemGroup. Este artigo do MSDN (para Visual Studio 2010) me deu as orientações que eu procurava:

Observe que quando o editor de recursos adiciona uma imagem, ele define Build Action como None , porque o arquivo .resx faz referência ao arquivo de imagem. No momento da criação, a imagem é puxada para o arquivo .resources criado a partir do arquivo .resx. A imagem pode ser acessada facilmente por meio da classe fortemente tipada gerada automaticamente para o arquivo .resx. Portanto, você não deve alterar essa configuração para Recurso incorporado , pois isso incluiria a imagem duas vezes na montagem.

Resolução: com esta orientação, usando um editor de texto, alterei os Contentelementos de tipo de item para None.

Além disso, para obter uma visão geral dos itens do MSBuild, consulte este artigo do MSDN .

DavidRR
fonte
3

Eu tenho um projeto que não contém itens compiláveis ​​(ele armazena html e javascript para testes de unidade de jasmim).

Um dia minha solução (que continha o referido projeto) parou de compilar dizendo "O destino" Compilar "não existe no projeto".

Eu adicionei uma importação para trazer o compilador, que funcionou bem na minha máquina, mas falhou ao usar o msbuild no servidor de compilação.

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

Eu mudei uma linha de

<None Include="SpecRunner.html" />

para

<Content Include="SpecRunner.html" />

e funcionou também no servidor de compilação.

cedd
fonte
2

Você não precisa de Nenhum em um arquivo de projeto de modelo para incluir os arquivos definidos no .vstemplate, caso contrário, eles serão perdidos no processo de criação e conversão. Eles são deixados para trás na pasta temporária usada para criar tudo e, em seguida, excluídos logo em seguida.

Cara de CAD
fonte
1

No meu caso .Pubxml é um desses arquivos da lista Nenhum . Não se destina à criação de soluções ou como um arquivo estático para projeto da web. Mas para publicar o site no Azure, as configurações estão presentes nisso.

De acordo com o artigo da Microsoft, estes são os principais tipos que vemos entre as tags de arquivo .csproj :

Nenhum - o arquivo não está incluído no grupo de saída do projeto e não é compilado no processo de construção. Um exemplo é um arquivo de texto que contém documentação, como um arquivo Leia-me.

Compilar - O arquivo é compilado na saída da compilação. Essa configuração é usada para arquivos de código.

Conteúdo - O arquivo não é compilado, mas está incluído no grupo de saída Conteúdo. Por exemplo, essa configuração é o valor padrão para um arquivo .htm ou outro tipo de arquivo da Web.

Recurso incorporado - esse arquivo é incorporado na saída de compilação do projeto principal como uma DLL ou executável. Geralmente é usado para arquivos de recursos.

krishna kanth
fonte
1
Por favor, comente aqui, se algo for enganoso ou não estiver claro. Apenas um voto negativo não me ajuda a melhorá-lo. Desde já, obrigado.
precisa saber é o seguinte
1
Muitas vezes, recebi o erro: o nome do elemento "Nenhum" para incluir "Properties \ PublishProfiles \ FolderProfile.pubxml" deve ser "Conteúdo". no meu projeto Asp.Net no bambu, e em algum momento voltar a executar o acúmulo pode simplesmente corrigi-lo, então não sei o que exatamente é o problema
Bochen Lin
Olá @BochenLin, os detalhes que você mencionou aqui são um pouco escassos. Você pode tentar fornecer mais detalhes aqui ou postar uma nova pergunta com detalhes completos do problema e captura de tela, se possível [e compartilhar o link da pergunta aqui].
krishna kanth
0

Os arquivos de conteúdo não são incluídos em uma construção, mas em uma publicação.

Nenhum arquivo não é incluído em uma construção ou publicação, a menos que seja configurado por você. Por exemplo, uma configuração "Copiar no diretório de saída" de "Sempre" ou "Mais recente" fará com que eles sejam incluídos na criação e publicação.

carlin.scott
fonte