DEV Community

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

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

leonardossev profile image Leonardo Santos ・2 min read

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...])

Para o resolve():
path.resolve([params...])

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?

Discussion

pic
Editor guide
Collapse
mariagcoliva profile image