Pergunta

Qual é a melhor estrutura para escrever módulos? ExtUtils::MakeMaker (h2xs) ou Módulo::Construir?

Foi útil?

Solução

OBSERVAÇÃO Este conselho está desatualizado. Module::Build foi removido do núcleo Perl mas continua vivo como um módulo CPAN.Os prós e os contras ainda permanecem, e minhas opiniões sobre o MakeMaker ainda permanecem.


Como ex-mantenedor do ExtUtils::MakeMaker, gosto de recomendar Module::Build porque MakeMaker é um show de terror.Módulo::Build é muito melhor montado.Mas essas não são suas preocupações e apresentarei minha resposta "menos incômoda para você".

Sumário executivo:

Como o suporte Module::Build não está 100% implementado em todo o Perl, comece com MakeMaker.Se você quiser fazer alguma personalização, mude para Module::Build.Como seu layout básico, opções e interface são quase idênticos, isso será fácil.Por mais sedutor que pareça, evite Module::Install.

Felizmente, Module::Build pode emular o MakeMaker, o que ajuda um pouco, mas não ajuda se você for fazer alguma customização.Ver Módulo::Build::Compat.

Para versões CPAN, usar Module::Build é adequado.Há Module::Build material suficiente no CPAN agora que todos já conseguiram inicializá-lo.

Finalmente, o novo configure_requires A opção permite que os shells CPAN saibam que devem instalar o Module::Build antes de começarem a construir o módulo.Infelizmente, apenas os shells CPAN mais recentes conhecem o configure_requires.

Ah, faça o que fizer, não use h2xs (a menos que esteja escrevendo código XS ...e mesmo assim pense sobre isso).

Prós do MakeMaker:

  • Vem com Perl e usado pelo núcleo Perl (portanto, é ativamente mantido e assim permanecerá para sempre)
  • Tudo sabe o que fazer com um Makefile.PL.
  • A maior parte da documentação de criação de módulos cobrirá o MakeMaker.
  • Usa make (quem conhece make pode depurar e corrigir a build processo)

Contras do MakeMaker:

  • Requer make (pense no Windows)
  • Difícil de personalizar
  • Ainda mais difícil de personalizar e tornar multiplataforma
  • Difícil de depurar quando algo dá errado (a menos que você entenda make)

Módulo::Construir Prós:

  • Mais fácil de personalizar/subclassificar
  • Perl Puro
  • Mais fácil de depurar (é Perl)
  • Pode emular o MakeMaker de várias maneiras
  • O shell CPAN instalará o Module::Build para você

Módulo::Construir Contras:

  • Os mantenedores do Module::Build (e na verdade todos da gangue Perl Toolchain) odeiam isso
  • Versões mais antigas de clientes CPAN (incluindo CPANPLUS) não sabem nada sobre Module::Build.

Módulo :: Instalar Prós:

  • Interface elegante
  • Bundles em si, você tem uma versão conhecida
  • Tudo sabe como lidar com um Makefile.PL

Módulo :: Instalar Contras:

  • Requer marca
  • Sempre usa versão empacotada, vulnerável a quebras externas
  • Difícil de personalizar fora de sua interface
  • Mucks com a coragem do MakeMaker, então um novo lançamento do MakeMaker acabará quebrando-o.
  • Não sabe como gerar um arquivo META usando a meta-spec v2 (cada vez mais um problema com ferramentas mais recentes)

Outras dicas

Há duas perguntas aqui.

Primeiro, nunca use h2xs.É uma maldade desatualizada, embora eu suponha que se você estiver realmente tentando transformar um arquivo de cabeçalho em código XS, pode ser útil (nunca fiz isso sozinho).

Atualização de 2011:Eu recomendo fortemente dar uma olhada Dist::Zilla, especialmente se você acha que manterá mais de um módulo.

Para criar um novo módulo, use Module::Starter.Funciona muito bem e tem alguns plugins interessantes para personalizar a saída.

Segundo, você está perguntando qual sistema de compilação deve usar.Os três concorrentes são ExtUtils::MakeMaker (EUMM), Module::Build (MB) e Module::Install (MI).

EUMM é um trabalho horrível e desagradável, mas funciona, e se você não estiver personalizando seu processo de construção, funciona perfeitamente.

MB é o garoto novo e tem seus detratores.A grande vantagem é que, se você deseja personalizar fortemente seu processo de instalação e construção, é bem possível fazer isso de maneira sensata (e de maneira multiplataforma) usando MB.Realmente não é possível usar o EUMM.

Finalmente, MI é basicamente um wrapper declarativo sobre EUMM.Ele também se empacota junto com sua distribuição, na tentativa de solucionar problemas com usuários que tentam instalar módulos com módulos antigos do conjunto de ferramentas.A desvantagem do truque "package self" é que se houver um bug no próprio MI, você terá que relançar todos os seus módulos apenas para corrigi-lo.

No que diz respeito à personalização, existem alguns plugins para MI, mas se você quiser ir além deles, você voltará ao problema de lidar com Makefiles e construir ferramentas em mais de uma dúzia de plataformas, então isso realmente não vai ajudar. você é demais nesse reino.

Acabei de enviar Distribuição::Fogão para o CPAN.É o que uso para fazer novas distribuições.O bom disso é que suas distribuições podem ser o que você quiser:você está apenas preparando alguns modelos.Eu não me importo se alguém usa.Para mim é simples, de baixa tecnologia e não causa problemas extras.

Você pode começar com algo como Módulo::Iniciador para criar seus modelos iniciais, adicione seu próprio padrão e sua maneira favorita de fazer as coisas.Você escolhe não apenas o que deseja em cada arquivo, mas também quais arquivos serão exibidos na distribuição.À medida que você descobre como gosta de fazer as coisas, basta atualizar seus próprios modelos.

Quanto ao Makemaker e Module::Build, o futuro é Module::Build.Somos mais apenas nós, velhos, usando o Makemaker.:) Existem maneiras de usar os dois (ou fingir que usam os dois) ao mesmo tempo. Veja os documentos Module::Build, Module::Build::Compat e Module::Install.Module::Build foi expulso da Biblioteca Padrão do Perl e seu futuro é incerto.Está de volta ao Makemaker como um sistema de construção.

Embora esta seja uma resposta um tanto evasiva, tente usar cada uma apenas para obter um pouco de experiência com cada uma.

Você também pode querer dar uma olhada Dist-Zilla que é uma nova ferramenta somente de autor para criar distribuições.Porque apenas ajuda a construir a distribuição, não vem com o seu código nem faz qualquer instalação, ele pode fazer muitas coisas poderosas.

O único problema de compatibilidade em relação ao Module::Build é quando um usuário tenta instalar módulos sem atualizar seu cliente CPAN (CPAN.pm ou CPANPLUS.pm). Se eles estiverem instalando seu módulo a partir do CPAN, eles podem facilmente atualizar seu cliente do mesmo espelho.

Se você não quer fazer qualquer coisa complicado em seu processo de construção, claro:use EUMM.Mas se você tiver um problema de compilação em uma plataforma de destino diferente, poderá acabar no Makefile, que é diferente em cada variação do make.

Module::Build oferece muitos recursos (qualquer coisa que você possa imaginar se estendê-lo) e é todo perl para que você nunca acabe depurando um makefile.Module::Install oferece recursos, mas você precisa agrupá-los e tudo acaba passando por 'make' no final.

Eu também recomendo Module::Build e Module::Starter (com o Plug-in TT2).

Module::Build é melhor de qualquer maneira, mas é menos amplamente suportado que ExtUtils::MakeMaker (mais especificamente, versões mais antigas do Perl não o suportam imediatamente).Isso depende de suas necessidades.

Pessoalmente, eu recomendo Module::Install, assim como muitas pessoas que conheço - pessoas como Catalyst e Moose também o usam.

Aqui está um pequeno esclarecimento sobre a direção que eu esperava que as respostas tomassem:

  • prós/contras de vários frameworks
  • compatibilidade/base de instalação de frameworks
  • adequação para uso interno (local) vs.versões externas (CPAN)
  • não respostas básicas "usar X"

A resposta de David tem algumas boas informações prós/contras. A resposta de Leão alude à compatibilidade, mas não é explícito.Como Brian D Foy mencionou, apenas os antigos usam EUMM, mas não estou convencido de que MB seja uma boa estrutura para coisas destinadas ao CPAN devido a não fazer parte do núcleo até 5.9.

Há prós e contras para ambos.Hoje em dia eu uso e recomendo Module::Build e Module::Starter.

EU::MM ainda parece ser o mais amplamente suportado e popular, mas Module::Build está se atualizando.Além disso, confira Módulo::Iniciador para um módulo que o ajudará a começar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top