DEV Community

Cover image for Driblando separadores específicos dos SO's com Node.js
Leonardo Santos
Leonardo Santos

Posted on • Updated on

Driblando separadores específicos dos SO's com Node.js

Situação

Outro dia, no serviço, me encontrei em uma situação em que determinado projeto, desenvolvido em Node.js, estava sendo executado normalmente em minha máquina porém na máquina de outros colegas de trabalho não.

Problema

O problema relatado durante a execução do projeto era de que certos arquivos não estavam sendo encontrados em algumas configurações de importação.

Descoberta

Sugerimos então que o problema poderia se dar ao fato de estarmos utilizando diferentes sistemas operacionais. Enquanto que eu utilizava o Ubuntu 18.04, alguns outros colegas da equipe estavam utilizando Windows 10.

Resolução

Como dito anteriormente, o projeto havia sido desenvolvido em Node.js. E para a nossa alegria ele oferece um módulo para trabalharmos com arquivos e diretórios dentro de um sistema de arquivos: o módulo path.

O nosso projeto estava utilizando o método path.join() para "montar" os caminhos para as quais os nossos arquivos de importação estavam localizados. Porém, de acordo com a documentação do path.join():

The path.join() method joins all given path segments together using the platform-specific separator as a delimiter, then normalizes the resulting path.

Ou seja, ele utiliza o separador de diretórios do próprio sistema operacional. No caso, o Windows utiliza um separador diferente do Linux. Enquanto que o separador de diretórios no Windows é a \\ (barras invertidas, backslashes), o Linux utiliza a / (barra oblíqua).

Como solução, aproveitamos para utilizar um outro método que a API path nos fornece: o path.resolve().

Diferentemente do join(), o resolve() não faz o uso do separador específico do sistema operacional. Dessa forma, quando a normalização dos caminhos for realizada pelo Node.js, o mesmo caminho será percorrido tanto no Windows quanto no Linux ou macOS.

Utilizando path.join() e path.resolve()

A utilização de ambos os métodos é parecida:

Para o join():

path.join([params...])
Enter fullscreen mode Exit fullscreen mode

Para o resolve():

path.resolve([params...])
Enter fullscreen mode Exit fullscreen mode

Você passa para os métodos um array que "simulariam" o caminho para se chegar até determinado diretório/arquivo.
Exemplo:

Considerando que estamos no seguinte diretório /home/leo/app e queiramos navegar para dois diretórios anteriores (/home):

const path = require('path');

path.join(['..', '..')];
Enter fullscreen mode Exit fullscreen mode

ou

const path = require('path');

path.resolve(['..', '..')];
Enter fullscreen mode Exit fullscreen mode

Ou, suponhamos que em /home/leo/app exista um diretório assets que possua outros diretórios dentro dele:

const path = require('path');

const profileImagePath = path.join(['assets', 'images', 'profile.png']);
Enter fullscreen mode Exit fullscreen mode

ou

const path = require('path');

const profileImagePath = path.resolve(['assets', 'images', 'profile.png']);
Enter fullscreen mode Exit fullscreen mode

Você já se deparou com algum desafio envolvendo diferentes sistemas operacionais? Como resolveu?

Latest comments (1)

Collapse
 
mariagcoliva profile image
Maria Gabriela Oliva

Muito bom!