App manifest

  • Revision slug: Apps/Manifest
  • Revision title: App manifest
  • Revision id: 389283
  • Criado:
  • Criador: MarcoBruno
  • É a revisão atual? Não
  • Comentar

Conteúdo da revisão

Um manifesto de aplicativo contém informação necessário para que o navegador web interaja com um aplicativo. Ele provê tanto elementos para serem lidos por humanos (um nome, um conjunto de ícones, uma descrição; possivelmente em várias línguas) quanto elementos para serem lidos por máquinas, que permite ao navegador exibir e executar aplicativos. O manifesto e a origem do aplicativo (protocolo, host name e número de porta) são em conjunto uma descrição completa do aplicativo instalado. O manifesto é codificado em um arquivo como uma estrutura de dados  JSON. Instalar um aplicativo consiste em prover uma URL deste arquivo para o navegador.

Para publicar um aplicativo, a partir de uma página sua, você inicia a instalação do aplicativo (por exemplo, ao chamar navigator.mozApps.install() usando um botão). Quando uma loja ou diretório publica um aplicativo, isto causa a instalação do aplicativo provendo ao navegador o URL do manifesto deste aplicativo.

Veja Sobre manifestos de aplicativos para ler algumas perguntas frequentes.

Exemplo de manifesto

Você pode copiar o texto seguinte para um arquivo de texto e substituir os valores com as suas próprias informações.

{
  "version": "1.0",
  "name": "MozillaBall",
  "description": "Exciting Open Web development action!",
  "icons": {
    "16": "/img/icon-16.png",
    "48": "/img/icon-48.png",
    "128": "/img/icon-128.png"
  },
  "developer": {
    "name": "Mozilla Labs",
    "url": "http://mozillalabs.com"
  },
  "installs_allowed_from": ["*"],
  "appcache_path": "/cache.manifest",
  "locales": {
    "es": {
      "description": "¡Acción abierta emocionante del desarrollo del Web!",
      "developer": {
        "url": "http://es.mozillalabs.com/"
      }
    },
    "it": {
      "description": "Azione aperta emozionante di sviluppo di fotoricettore!",
      "developer": {
        "url": "http://it.mozillalabs.com/"
      }
    }
  },
  "default_locale": "en"
}

Campos

Os campos permitidos em um manifesto são:

name
Um nome legível por humanos para o aplicativo (máximo de 128 caracteres).
description
Uma descrição legível por humanos do aplicativo (máximo de 1024 caracteres).
launch_path
(opcional) O caminho a partir da origem do aplicativo que é carregado quando o aplicativo é executado. Caso não seja incluído, a origem do aplicativo é tratada como o URL de execução. Veja Tratamento dos caminhos.
icons
(opcional) Uma mapeamento de tamanhos de ícones para caminhos (que devem ser caminhos absolutos).Cada um deve conter imagens quadradas que visualmente representam o aplicativo.
Para Windows 7 e Android, os seguintes tamanhos de ícones são suportados:
  • 16 x 16
  • 32 x 32
  • 48 x 48
  • 64 x 64
  • 128 x 128
  • 256 x 256

Note que o Mozilla Marketplace exige que todos aplicativos submetidos tenham no mínimo um ícone com tamanho de pelo menos 128x128.

developer
(opcional) Informação sobre o desenvolvedor do aplicativo, adequada para a visualização em interfaces de dashboard:
name
O nome do desenvolvedor.
url
A URL para um site contendo mais informações sobre o desenvolvedor do aplicativo. Esta URL é tipicamente mostrada quando o usuário clica no nome do desenvolvedor do aplicativo ao visualizar os detalhes sobre o aplicativo dentro do dashboard (ou do navegador).
locales
(opcional) Uma mapeamento para localidades específicas dos dados contidos no manifesto, os quais as interfaces podem usar para mostrar visualizações localizadas. Cada entrada de localização é identificada por uma tag de localidade e contém uma representação esparsa do manifesto. Qualquer campo presente no valor locale substitui o respectivo campo no manifesto. Certos campos não podem ser substituídos, incluindo default_locale, o próprio locales e installs_allowed_from. Um manifesto que substitui qualquer um destes campos é inválido. Quando locales estiver presente, default_locale também deve estar presente.
default_locale
(obrigatório quando locales estiver presente) A tag de localidade para a tradução "padrão" das propriedades do manifesto. Isto é, a localidade dos valores não incluídos no mapeamento de locales.
installs_allowed_from
(opcional) Um array de origens (scheme+domain, por exemplo ["https://marketplace.mozilla.org"]) que tem permissão para iniciar a instalação desse aplicativo. Este campo permite que você explicitamente autorize apenas certos sites ou lojas, com os quais possue um relacionamento, a instalarem seu aplicativo. O array ["*"] significa que instalações deste aplicativo são permitidas a partir de qualquer site. Este é o padrão. Note que [] iria desautorizar a instalação a partir de qualquer site, incluindo seu próprio.
version
(opcional) Uma string que representa a versão do manifesto. O repositório não usa este valor para nada, mas você pode incluir esta string no manifesto e usá-lo para ajudar com situações de atualização. Veja a seção sobre atualizações mais abaixo.
screen_size
(versão futura) (opcional) Um objeto que pode conter propiedades min_height e min_width, que descrevem a altura e largura mínima em pixels que  aplicação precisa de forma a se desenhar corretamente. A interpretação desses valores é deixada a cargo da implementação da loja de aplicativos.
required_features
(versão futura) (opcional) Um array que consiste de um conjunto de valores que descreve funcionalidades específcas que o aplicativo necessita para executar corretamente. Uma lista completa de valores válidos ainda está pendente.
orientation
(versão futura) (opcional) Define a orientação a qual o aplicativo iniciará usando. Pode ser ou "portrait", "landscape", "portrait-secondary" ou "landscape-secondary". As opções sufixadas com "-secondary" implicam uma rotação de 180 graus comparadas com as opções sem este sufixo. Por exemplo, segurar o telefone de cabeça para baixo (mas ainda de maneira à largura ser menor que a altura) implica uma orientação "portrait-secondary". Caso este campo tenha um valor válido, a implementação não irá mudar a orientação do desenho do aplicativo, mesmo se o dispositivo for virado.
fullscreen
(versão futura) (opcional) Marque este valor como "true" ou "false" para indicar se o aplicativo deve ser lançado em modo de tela cheia.
widget
Este campo foi removido. Caso ele seja usado em um manifesto mais antigo, ele será ignorado.
appcache_path
(opcional) O caminho absoluto para o manifesto da cache de aplicação (AppCache).  Quando um aplicativo Open Web é instalado, o manifesto de AppCache será buscado e lido e seus recursos estáticos presentes no header CACHE serão armazenados.

Nota: Campos além dos especificados aqui serão ignorados.

Tratamento dos caminhos

Todos os campos que se referem álgum caminho no manifesto devem conter caminhos absolutos (por exemplo, '/images/myicon.png'), e serão servidos a partir da mesma origem que o aplicativo.

Servindo manifestos

O manifesto do aplicativo deve ser servido da mesma origem a qual o aplicativo está sendo servido.

Quando sendo servido a partir de arquivos estáticos, RECOMENDA-SE que o manifesto seja armazenado com uma extensão .webapp.  Manifestos de aplicativos DEVEM ser servidos com um header Content-Type de application/x-web-app-manifest+json (Nota: isto, no momento, não obrigatório para o Firefox, mas é obrigatório para o Marketplace). Manifestos PODEM ser servidos usando SSL para mitigar certas classes de ataques.

Espera-se que o documento seja UTF-8, mas outra codificação pode ser especificada com um parâmetro charset no header Content-Type  (e.g. Content-Type: application/x-web-app-manifest+json; charset=ISO-8859-4).

User Agents, sempre que possível, DEVERIAM identificar de forma significativa a identidade e status TLS do site ao solicitar que o usuário instale o aplicativo.

Servindo a partir do Apache

Em seu arquivo .htaccess, adicione o seguinte:

AddType application/x-web-app-manifest+json .webapp

Caso você não tenha um arquivo .htaccess, crie um no diretório raiz do seu servidor. Se isto não funcionar, o seu host pode exigir que você também inclua AddHandler x-web-app-manifest+json .webapp.

Servindo a partir do NGINX

Você precisa editar o seu arquivo mime.types no diretório conf. Ele provavelmente se encontra em /etc/nginx/ ou /opt/nginx/.

Você deve ter algo similar ao mostrado abaixo. Adicione o texto mostrado em negrito.

types {
  text/html   html htm shtml;
  text/css    css;
  text/xml    xml;
  application/x-web-app-manifest+json   webapp;
}
Servindo a partir do GitHub

Caso você sirva seu arquivo de manifesto a partir das páginas hospedadas no GitHub (http://pages.github.com/), o GitHub irá serví-la com o header correto. Você deve usar a extensão .webapp para seu arquivo manifesto. Examplo: manifest.webapp.

Atualizando manifestos

Um aplicativo respeita as regras normais de Web caching e pode, opcionalmente, utilizar mecanismos avançados para acelerar sua inicialização, como o HTML5 AppCache. Dito isto, não existem considerações especiais para atualizar os recursos normais que um aplicativo usa.

Aplicativos Web são differentes, entretanto, na gerencia do manifesto. Algumas mudanças feitas ao manifesto podem requerir aprovação do usuário. Dependendo da implementação do repositório de aplicativos, pode não ficar claro se uma atualização aconteceu.

Para lidar de uma maneira limpa com esta situação, você pode prover um campo version no manifesto do aplicativo. Depois disto você pode checar a versão utilizando o retorno da função navigator.mozApps.getInstalled(). Caso a versão instalada pelo usuário não seja a mais atual, você pode iniciar uma atualização usando a função navigator.mozApps.install().

O valor de version é uma string opaca ao repositório, então você pode usar qualquer esquema de versionamento que você quiser.

 

Fonte da revisão

<div class="wikistyle">
  <p>Um manifesto de aplicativo contém informação necessário para que o navegador web interaja com um aplicativo. Ele provê tanto elementos para serem lidos por humanos (um nome, um conjunto de ícones, uma descrição; possivelmente em várias línguas) quanto elementos para serem lidos por máquinas, que permite ao navegador exibir e executar aplicativos. O manifesto e a origem do aplicativo (protocolo, host name e número de porta) são em conjunto uma descrição completa do aplicativo instalado. O manifesto é codificado em um arquivo como uma estrutura de dados&nbsp; <a class="external" href="http://www.json.org/" title="http://www.json.org/">JSON</a>. Instalar um aplicativo consiste em prover uma URL deste arquivo para o navegador.</p>
  <p>Para publicar um aplicativo, a partir de uma página sua, você inicia a instalação do aplicativo (por exemplo, ao chamar <a href="/en/DOM/Apps.install" title="en/Apps/Apps_JavaScript_API/navigator.mozApps.install"><code>navigator.mozApps.install()</code></a> usando um botão). Quando uma loja ou diretório publica um aplicativo, isto causa a instalação do aplicativo provendo ao navegador o URL do manifesto deste aplicativo.</p>
  <p>Veja <a href="/en/Apps/FAQs/About_app_manifests" title="https://developer.mozilla.org/pt-BR/Apps/FAQs/About_app_manifests">Sobre manifestos de aplicativos</a> para ler algumas perguntas frequentes.</p>
  <h2 id="Exemplo_de_manifesto">Exemplo de manifesto</h2>
  <p>Você pode copiar o texto seguinte para um arquivo de texto e substituir os valores com as suas próprias informações.</p>
  <pre class="brush: js">
{
&nbsp; "version": "1.0",
&nbsp; "name": "MozillaBall",
&nbsp; "description": "Exciting Open Web development action!",
&nbsp; "icons": {
&nbsp;&nbsp;&nbsp; "16": "/img/icon-16.png",
&nbsp;&nbsp;&nbsp; "48": "/img/icon-48.png",
&nbsp;&nbsp;&nbsp; "128": "/img/icon-128.png"
&nbsp; },
&nbsp; "developer": {
&nbsp;&nbsp;&nbsp; "name": "Mozilla Labs",
&nbsp;&nbsp;&nbsp; "url": "http://mozillalabs.com"
&nbsp; },
&nbsp; "installs_allowed_from": ["*"],
&nbsp; "appcache_path": "/cache.manifest",
&nbsp; "locales": {
&nbsp;&nbsp;&nbsp; "es": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "description": "¡Acción abierta emocionante del desarrollo del Web!",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "developer": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "url": "http://es.mozillalabs.com/"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; },
&nbsp;&nbsp;&nbsp; "it": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "description": "Azione aperta emozionante di sviluppo di fotoricettore!",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "developer": {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "url": "http://it.mozillalabs.com/"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; }
&nbsp; },
&nbsp; "default_locale": "en"
}
</pre>
  <h2 id="Campos">Campos</h2>
  <p>Os campos permitidos em um manifesto são:</p>
  <dl>
    <dt>
      name</dt>
    <dd>
      Um nome legível por humanos para o aplicativo (máximo de 128 caracteres).</dd>
    <dt>
      description</dt>
    <dd>
      Uma descrição legível por humanos do aplicativo (máximo de 1024 caracteres).</dd>
    <dt>
      launch_path</dt>
    <dd>
      (opcional) O caminho a partir da origem do aplicativo que é carregado quando o aplicativo é executado. Caso não seja incluído, a origem do aplicativo é tratada como o URL de execução. Veja <a href="#path-handling">Tratamento dos caminhos</a>.</dd>
    <dt>
      icons</dt>
    <dd>
      (opcional) Uma mapeamento de tamanhos de ícones para caminhos (que devem ser <a href="#path-handling">caminhos absolutos</a>).Cada um deve conter imagens quadradas que visualmente representam o aplicativo.</dd>
    <dd>
      Para Windows 7 e Android, os seguintes tamanhos de ícones são suportados:
      <ul>
        <li>16 x 16</li>
        <li>32 x 32</li>
        <li>48 x 48</li>
        <li>64 x 64</li>
        <li>128 x 128</li>
        <li>256 x 256</li>
      </ul>
      <p>Note que o Mozilla Marketplace exige que todos aplicativos submetidos tenham no mínimo um ícone com tamanho de pelo menos 128x128.</p>
    </dd>
    <dt>
      developer</dt>
    <dd>
      (opcional) Informação sobre o desenvolvedor do aplicativo, adequada para a visualização em interfaces de dashboard:
      <dl>
        <dt>
          name</dt>
        <dd>
          O nome do desenvolvedor.</dd>
        <dt>
          url</dt>
        <dd>
          A URL para um site contendo mais informações sobre o desenvolvedor do aplicativo. Esta URL é tipicamente mostrada quando o usuário clica no nome do desenvolvedor do aplicativo ao visualizar os detalhes sobre o aplicativo dentro do dashboard (ou do navegador).</dd>
      </dl>
    </dd>
    <dt>
      locales</dt>
    <dd>
      (opcional) Uma mapeamento para localidades específicas dos dados contidos no manifesto, os quais as interfaces podem usar para mostrar visualizações localizadas. Cada entrada de localização é identificada por uma <a class="external" href="http://www.ietf.org/rfc/rfc4646.txt">tag de localidade</a> e contém uma representação esparsa do manifesto. Qualquer campo presente no valor <code>locale</code> substitui o respectivo campo no manifesto. Certos campos não podem ser substituídos, incluindo <code>default_locale</code>, o próprio <code>locales</code> e <code>installs_allowed_from</code>. Um manifesto que substitui qualquer um destes campos é inválido. Quando&nbsp;<code>locales</code> estiver presente, <code>default_locale</code> também deve estar presente.</dd>
    <dt>
      default_locale</dt>
    <dd>
      (obrigatório quando <code>locales</code> estiver presente) A tag de localidade para a tradução "padrão" das propriedades do manifesto. Isto é, a localidade dos valores não incluídos no mapeamento de&nbsp;<code>locales</code>.</dd>
    <dt>
      installs_allowed_from</dt>
    <dd>
      (opcional) Um array de origens (scheme+domain, por exemplo <code>["<a class="link-https" href="https://marketplace.mozilla.org" rel="freelink">https://marketplace.mozilla.org</a>"]</code>) que tem permissão para iniciar a instalação desse aplicativo. Este campo permite que você explicitamente autorize apenas certos sites ou lojas, com os quais possue um relacionamento, a instalarem seu aplicativo. O array [<code>"*"]</code> significa que instalações deste aplicativo são permitidas a partir de qualquer site. Este é o padrão. Note que&nbsp;<code>[]</code> iria desautorizar a instalação a partir de qualquer site, incluindo seu próprio.</dd>
    <dt>
      version</dt>
    <dd>
      (opcional) Uma string que representa a versão do manifesto. O repositório não usa este valor para nada, mas você pode incluir esta string no manifesto e usá-lo para ajudar com situações de atualização. Veja a seção sobre atualizações mais abaixo.</dd>
    <dt>
      screen_size</dt>
    <dd>
      (versão futura) (opcional) Um objeto que pode conter propiedades <code>min_height</code> e <code>min_width</code>, que descrevem a altura e largura mínima em pixels que&nbsp; aplicação precisa de forma a se desenhar corretamente. A interpretação desses valores é deixada a cargo da implementação da loja de aplicativos.</dd>
    <dt>
      required_features</dt>
    <dd>
      (versão futura) (opcional) Um array que consiste de um conjunto de valores que descreve funcionalidades específcas que o aplicativo necessita para executar corretamente. Uma lista completa de valores válidos ainda está pendente.</dd>
    <dt>
      orientation</dt>
    <dd>
      (versão futura) (opcional) Define a orientação a qual o aplicativo iniciará usando. Pode ser ou "portrait", "landscape", "portrait-secondary" ou "landscape-secondary". As opções sufixadas com "-secondary" implicam uma rotação de 180 graus comparadas com as opções sem este sufixo. Por exemplo, segurar o telefone de cabeça para baixo (mas ainda de maneira à largura ser menor que a altura) implica uma orientação "portrait-secondary". Caso este campo tenha um valor válido, a implementação não irá mudar a orientação do desenho do aplicativo, mesmo se o dispositivo for virado.</dd>
    <dt>
      fullscreen</dt>
    <dd>
      (versão futura) (opcional) Marque este valor como "true" ou "false" para indicar se o aplicativo deve ser lançado em modo de tela cheia.</dd>
    <dt>
      widget</dt>
    <dd>
      Este campo foi removido. Caso ele seja usado em um manifesto mais antigo, ele será ignorado.</dd>
    <dt>
      appcache_path</dt>
    <dd>
      (opcional) O caminho absoluto para o manifesto da cache de aplicação (<a href="/en/HTML/Using_the_application_cache" title="https://developer.mozilla.org/en/Offline_resources_in_Firefox">AppCache</a>).&nbsp; Quando um aplicativo Open Web é instalado, o manifesto de AppCache será buscado e lido e seus recursos estáticos presentes no header CACHE serão armazenados.</dd>
  </dl>
  <div class="note style-wrap">
    <p><strong>Nota:</strong> Campos além dos especificados aqui serão ignorados.</p>
  </div>
  <h2 id="Tratamento_dos_caminhos_">Tratamento dos caminhos <a name="path-handling"></a></h2>
  <a name="path-handling"> </a>
  <p><a name="path-handling">Todos os campos que se referem álgum caminho no manifesto devem conter caminhos absolutos (por exemplo, '/images/myicon.png'), e serão servidos a partir da mesma origem que o aplicativo.</a></p>
  <h2 id="Servindo_manifestos"><a name="path-handling">Servindo manifestos</a></h2>
  <p><a name="path-handling">O manifesto do aplicativo deve ser servido da mesma origem a qual o aplicativo está sendo servido.</a></p>
  <p><a name="path-handling">Quando sendo servido a partir de arquivos estáticos, RECOMENDA-SE que o manifesto seja armazenado com uma extensão <code>.webapp</code>.&nbsp; Manifestos de aplicativos DEVEM ser servidos com um header <code>Content-Type</code> de <code>application/x-web-app-manifest+json</code> (Nota: isto, no momento, não obrigatório para o Firefox, mas é obrigatório para o Marketplace). Manifestos PODEM ser servidos usando SSL para mitigar certas classes de ataques.</a></p>
  <p><a name="path-handling">Espera-se que o documento seja UTF-8, mas outra codificação pode ser especificada com um parâmetro <code>charset</code> no header <code>Content-Type</code>&nbsp; (e.g. <code>Content-Type: application/x-web-app-manifest+json; charset=ISO-8859-4</code>).</a></p>
  <p><a name="path-handling">User Agents, sempre que possível, DEVERIAM identificar de forma significativa a identidade e status TLS do site ao solicitar que o usuário instale o aplicativo.</a></p>
  <h5 id="Servindo_a_partir_do_Apache"><a name="path-handling">Servindo a partir do Apache</a></h5>
  <p><a name="path-handling">Em seu arquivo .htaccess, adicione o seguinte:</a></p>
  <pre>
<a name="path-handling">AddType application/x-web-app-manifest+json .webapp
</a></pre>
  <div class="note">
    <a name="path-handling"><strong>Nota:</strong> Isto assume que você está usando a extensão .webapp. Caso você esteja usando .json ou outra extensão, você terá que modificar o código de acordo a refletir isto.</a></div>
  <p><a name="path-handling">Caso você não tenha um arquivo .htaccess, crie um no diretório raiz do seu servidor. Se isto não funcionar, o seu host pode exigir que você também inclua <code>AddHandler x-web-app-manifest+json .webapp</code>.</a></p>
  <h5 id="Servindo_a_partir_do_NGINX"><a name="path-handling">Servindo a partir do NGINX</a></h5>
  <p><a name="path-handling">Você precisa editar o seu arquivo mime.types no diretório conf. Ele provavelmente se encontra em /etc/nginx/ ou /opt/nginx/.</a></p>
  <p><a name="path-handling">Você deve ter algo similar ao mostrado abaixo. Adicione o texto mostrado em negrito.</a></p>
  <pre>
<a name="path-handling">types {
  text/html   html htm shtml;
  text/css    css;
  text/xml    xml;
<strong>  application/x-web-app-manifest+json   webapp;</strong>
}
</a></pre>
  <div class="note">
    <a name="path-handling"><strong>Nota:</strong> Isto assume que você está usando a extensão .webapp. Caso você esteja usando .json ou outra extensão, você terá que modificar o código de acordo a refletir isto.</a></div>
  <h5 id="Servindo_a_partir_do_GitHub"><a name="path-handling">Servindo a partir do GitHub</a></h5>
  <p><a name="path-handling">Caso você sirva seu arquivo de manifesto a partir das páginas hospedadas no GitHub (</a><a class="external" href="http://pages.github.com/" title="http://pages.github.com/">http://pages.github.com/</a>), o GitHub irá serví-la com o header correto. Você deve usar a extensão <code>.webapp</code> para seu arquivo manifesto. Examplo: <code>manifest.webapp</code>.</p>
  <h2 id="Atualizando_manifestos">Atualizando manifestos</h2>
  <p>Um aplicativo respeita as regras normais de Web caching e pode, opcionalmente, utilizar mecanismos avançados para acelerar sua inicialização, como o <a class="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#offline">HTML5 AppCache</a>. Dito isto, não existem considerações especiais para atualizar os recursos normais que um aplicativo usa.</p>
  <p>Aplicativos Web são differentes, entretanto, na gerencia do manifesto. Algumas mudanças feitas ao manifesto podem requerir aprovação do usuário. Dependendo da implementação do repositório de aplicativos, pode não ficar claro se uma atualização aconteceu.</p>
  <p>Para lidar de uma maneira limpa com esta situação, você pode prover um campo <code>version</code> no manifesto do aplicativo. Depois disto você pode checar a versão utilizando o retorno da função<code> </code><a href="/en/DOM/Apps.getInstalled" title="en/Apps/Apps_JavaScript_API/navigator.mozApps.getInstalled"><code>navigator.mozApps.getInstalled()</code></a>. Caso a versão instalada pelo usuário não seja a mais atual, você pode iniciar uma atualização usando a função <code><a href="/en/DOM/Apps.install" title="https://developer.mozilla.org/en/Apps/Apps_JavaScript_API/navigator.mozApps.install">navigator.mozApps.install()</a>.</code></p>
  <p>O valor de <code>version</code> é uma string opaca ao repositório, então você pode usar qualquer esquema de versionamento que você quiser.</p>
</div>
<p>&nbsp;</p>
Reverter para esta revisão