Solucionar error de Jekyll en Vercel por nombres de archivo con caracteres especiales
Guía paso a paso para corregir el error de compilación de Jekyll en Vercel causado por archivos con tildes, eñes u otros caracteres especiales en sus nombres, incluyendo cómo renombrarlos y actualizar referencias.
Solucionar error de Jekyll en Vercel por nombres de archivo con caracteres especiales
Introducción
Breve explicación del problema:
- Al desplegar un sitio Jekyll en Vercel, el build fallaba con un error
Encoding::UndefinedConversionError
al intentar convertir nombres de archivo desdeASCII-8BIT
aUTF-8
. - La causa era que algunos ficheros en
public/uploads/
tenían caracteres especiales (acentos, eñes, guiones raros, comillas tipográficas…). - Jekyll en Vercel no los manejaba bien y el build se rompía.
Síntomas del problema
- El deploy en Vercel falla durante
jekyll build
. -
Mensaje de error típico:
1
"\xC3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
- En local puede que funcione sin problema, pero en Vercel no.
Solución paso a paso
1. Identificar archivos problemáticos
Ejecutar en local un script Ruby para detectar ficheros con nombres no seguros y proponer renombres:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
bundle exec ruby <<'RUBY'
require 'i18n'; I18n.available_locales = [:en]
require 'fileutils'
M = []
Dir.glob('public/uploads/**/*', File::FNM_CASEFOLD).sort.each do |p|
next unless File.file?(p)
dir = File.dirname(p)
base = File.basename(p)
safe = I18n.transliterate(base) # quita tildes y caracteres raros
safe = safe.downcase.gsub(/[^0-9a-z.\-]+/, '-').gsub(/-+/, '-').gsub(/^-|-$/, '')
next if base == safe
q = File.join(dir, safe)
i = 1
while File.exist?(q)
q = File.join(dir, safe.sub(/(\.[^.]+)?$/){"-#{i}#{$1}"})
i += 1
end
M << [p, q]
end
puts "# Renames:"
M.each{|old,new| puts "#{old}\t=>\t#{new}" }
File.write('uploads_renames.tsv', M.map{|o,n| "#{o}\t=>\t#{n}"}.join("\n")) unless M.empty?
RUBY
Esto genera un archivo uploads_renames.tsv
con los cambios propuestos.
2. Renombrar los archivos
1
2
3
4
5
6
7
8
9
10
bundle exec ruby <<'RUBY'
require 'fileutils'
map = File.read('uploads_renames.tsv', encoding:'UTF-8').split("\n").map{|l| l.split("\t=>\t",2)}
map.each do |old,newp|
next if old.nil? || newp.nil?
FileUtils.mkdir_p(File.dirname(newp))
FileUtils.mv(old, newp)
puts "OK #{old} -> #{newp}"
end
RUBY
3. Actualizar las referencias en posts y páginas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
bundle exec ruby <<'RUBY'
map = File.read('uploads_renames.tsv', encoding:'UTF-8').split("\n").map{|l| l.split("\t=>\t",2)}
files = Dir.glob('{_posts,_tabs,_pages}/**/*.{md,markdown,html}', File::FNM_CASEFOLD) +
Dir.glob('*.{md,markdown,html}', File::FNM_CASEFOLD)
files.uniq!
files.each do |f|
txt = File.read(f, encoding:'UTF-8')
org = txt.dup
map.each do |old,newp|
rel_old = old.sub(%r{\A\.?/},'')
rel_new = newp.sub(%r{\A\.?/},'')
txt.gsub!(rel_old, rel_new)
txt.gsub!(File.basename(rel_old), File.basename(rel_new))
end
if txt != org
File.write(f, txt, encoding:'UTF-8')
puts "Updated: #{f}"
end
end
RUBY
Resultado final
- Todos los archivos en
public/uploads
tienen nombres compatibles con Vercel/Jekyll. - Las referencias en los posts se han actualizado.
- El deploy en Vercel vuelve a funcionar sin errores.
Conclusión
- Siempre es recomendable evitar caracteres especiales en nombres de archivo cuando se trabaja con Jekyll, Git y despliegues automáticos.
- Este procedimiento no solo soluciona el problema puntual, sino que previene errores futuros al normalizar todos los nombres y referencias.
Esta entrada está licenciada bajo
CC BY 4.0
por el autor.