Objetivos e destinos do MSBuild em um pacote
Além dos assemblies mais tradicionais, os pacotes NuGet às vezes podem adicionar destinos de compilação personalizados ou propriedades a projetos que consomem esse pacote.
Isso pode ser obtido adicionando-se um arquivo MSBuild válido, no formato <package_id>.targets
ou <package_id>.props
(como Contoso.Utility.UsefulStuff.targets
) dentro das pastas de compilação do projeto.
Pastas de compilação
À medida que o NuGet evoluiu, várias pastas diferentes para compilação .props
e .targets
foram adicionadas.
Pasta | Versão do NuGet | Usar |
---|---|---|
compilar | 2.5+ | Compile lógica para cada estrutura de um projeto. |
buildMultiTargeting | 4.0+ | Compile lógica para o outer build para projetos que visam várias estruturas. Somente PackageReference. |
buildTransitive | 5.0+ | Crie lógica para ativos que fluem transitivamente para qualquer projeto consumidor. Confira a página de recursos. Somente PackageReference. |
Pasta de compilação específica da estrutura
Todas as 3 pastas de compilação seguem o mesmo padrão para decidir o arquivo mais adequado com base na estrutura de destino do projeto.
Arquivos na pasta de compilação raiz, build/<package_id>.targets
e build/<package_id>.props
são considerados adequados para todas as estruturas de destino.
Para fornecer arquivos específicos de estrutura, primeiro coloque-os em subpastas apropriadas, como os seguintes:
\build
\netstandard1.4
\Contoso.Utility.UsefulStuff.props
\Contoso.Utility.UsefulStuff.targets
\net462
\Contoso.Utility.UsefulStuff.props
\Contoso.Utility.UsefulStuff.targets
Prefira usar pastas de compilação específicas da estrutura sempre que apropriado para evitar instalações de falsos positivos em projetos que podem não ser compatíveis com seu pacote.
Observe que se um pacote não tiver nenhum arquivo nas pastas lib
ou ref
e arquivos somente em uma pasta de compilação específica da estrutura, esse pacote será considerado compatível com todos os projetos. Versões atualizadas das ferramentas do pacote acionam o aviso NU5127 quando esses pacotes são criados.
Projetos consumindo pacotes com arquivos de compilação
Projetos PackageReference
.props
e .targets
não são adicionados ao projeto, mas são disponibilizados por meio de {projectName}.nuget.g.targets
e {projectName}.nuget.g.props
. Esses arquivos são gerados automaticamente quando a restauração é executada.
Quando um projeto tem como alvo mais de uma estrutura, as importações para esses arquivos são condicionadas ao nome da estrutura de destino.
Os arquivos .props
e .targets
do MSBuild podem ser colocados na pasta \buildMultiTargeting
para direcionamento entre estruturas.
Quando as importações são geradas, uma condição de que a propriedade $(TargetFramework)
do MSBuild esteja vazia é definida.
Projetos packages.config
Quando o NuGet instala um pacote com arquivos \build
, ele adiciona elementos <Import>
do MSBuild ao arquivo de projeto que aponta para os arquivos .targets
e .props
. (.props
é adicionado na parte superior do arquivo de projeto; .targets
é adicionado na parte inferior.) Um elemento <Import>
do MSBuild condicional separado é adicionado para cada estrutura de destino.
Criando pacotes com objetos e destinos do MSBuild
Você pode usar qualquer uma das seguintes ferramentas para incluir .props
e .targets
do MSBuild em seu pacote.
Orientação para o conteúdo de objetos e destinos do MSBuild
O NuGet não limita como você cria .props
e .targets
, pois eles irão variar de acordo com a necessidade do autor do pacote e dos projetos de destino em si.
Há algumas coisas que não devem ser feitas em .props
e .targets
de pacotes, como não especificar propriedades e itens que afetam a restauração, pois esses serão automaticamente excluídos.
Alguns exemplos de propriedades que não devem ser adicionadas ou atualizadas: TargetFramework, TargetFrameworkMoniker, TargetPlatformMoniker, AssetTargetFallback etc.
Alguns exemplos de itens que não devem ser adicionados ou atualizados: PackageReference, PackageVersion, PackageDownload, etc.