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(['..', '..')];
ou
const path = require('path');
path.resolve(['..', '..')];
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']);
ou
const path = require('path');
const profileImagePath = path.resolve(['assets', 'images', 'profile.png']);
Você já se deparou com algum desafio envolvendo diferentes sistemas operacionais? Como resolveu?
Top comments (1)
Muito bom!