Настройка Homestead для работы для пользователей Windows

РЕДАКТИРОВАТЬ: см. Обновленный раздел ниже, где я изменил код в соответствии с предложениями решения

Я использую vagrant с усадьбой на моей машине win7. И я хочу установить некоторые пакеты gulp, например, gulp-uncss, который не работает, потому что я получаю сообщение об ошибке, добавленное ниже.

После некоторых исследований и обсуждений на канале #npm IRC мне подсказали эту проблему здесь:

https://github.com/npm/npm/wiki/Troubleshooting#running-a-vagrant-box-on-windows-fails-due-to-path-length-issues

Согласно этой записи, пользователи Windows по-прежнему сталкиваются с проблемой при использовании vagrant, поскольку общая папка между хостом и гостевым компьютером имеет ограничение по максимальному количеству символов в 260 символов, что всегда было основной проблемой при разработке Windows.

Похоже, решение состоит в том, чтобы изменить файл vagrant и положения вместе с ним.

Вот начальная ошибка:

vagrant@homestead:~/Code/Wordpress/wp-content/themes/expimo$ gulp uncss
[10:51:07~/Code/Wordpress/wp-content/themes/expimo/gulpfile.js
[10:51:07] Starting 'uncss'...

/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/bluebird/js/main/async.js:43
fn = function () { throw arg; };
^
TypeError: Bad argument
at TypeError (native)
at ChildProcess.spawn (child_process.js:1136:26)
at /home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/lib/spawn.js:82:38
at init (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/makePro
at new Promise (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/makePromise.js:27:53)
at Function.promise (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/when.js:97:10)
at startPhantom (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/lib/spawn.js:58:25)
at tryCatchReject (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/makePromise.js:845:30)
at runContinuation1 (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/makePromise.js:804:4)
at Fulfilled.when (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/makePromise.js:592:4)
at Pending.run (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/makePromise.js:483:13)
at Scheduler._drain (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/Scheduler.js:62:19)
at Scheduler.drain (/home/vagrant/Code/Wordpress/wp-content/themes/expimo/node_modules/gulp-uncss/node_modules/uncss/node_modules/phridge/node_modules/when/lib/Scheduler.js:27:9)
at process._tickCallback (node.js:355:11)

Как я понял из записи, нужно ли мне модифицировать мой Vagrantfile и, возможно, даже добавить некоторые положения?

Это мой текущий Vagrantfile по умолчанию, добавленный через усадьбу:

require 'json'
require 'yaml'

VAGRANTFILE_API_VERSION = "2"
homesteadYamlPath = File.expand_path("~/.homestead/Homestead.yaml")
afterScriptPath = File.expand_path("~/.homestead/after.sh")
aliasesPath = File.expand_path("~/.homestead/aliases")

require_relative 'scripts/homestead.rb'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
if File.exists? aliasesPath then
config.vm.provision "file", source: aliasesPath, destination: "~/.bash_aliases"end

Homestead.configure(config, YAML::load(File.read(homesteadYamlPath)))

if File.exists? afterScriptPath then
config.vm.provision "shell", path: afterScriptPath
end
end

И, видимо, я должен вставить изменения, указанные здесь:
https://github.com/renobit/vagrant-node-env/commit/bdf15f2f301e2b1660b839875e34f172ea8be227

внутри этого Vagrantfile, так что усадьба работает правильно окнами.

Так как я только начал использовать vagrant, мои знания очень ограничены, поэтому я хотел бы получить любую помощь по этой теме. Заранее спасибо.

ОБНОВИТЬ

ОБНОВЛЕНИЕ к предложению Дэвида Майерса:

Я изменил свой Vagrantfile в соответствии с предложением Дэвида Майерса ниже, но безрезультатно:

require 'json'
require 'yaml'

VAGRANTFILE_API_VERSION = "2"confDir = $confDir ||= File.expand_path("~/.homestead")

homesteadYamlPath = confDir + "/Homestead.yaml"afterScriptPath = confDir + "/after.sh"aliasesPath = confDir + "/aliases"
require File.expand_path(File.dirname(__FILE__) + '/scripts/homestead.rb')

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
if File.exists? aliasesPath then
config.vm.provision "file", source: aliasesPath, destination: "~/.bash_aliases"end# this should be inserted right before the "Homestead.configure()" line
config.vm.provider "virtualbox" do |v, override|
if Vagrant::Util::Platform.windows?
override.vm.synced_folder "./Code", "/home/vagrant/Code", disabled: true

v.customize ["sharedfolder", "add", :id, "--name", "Code", "--hostpath", (("//?/" + File.dirname(__FILE__) + "/Code").gsub("/","\\"))]

override.vm.provision :shell, inline: "mkdir -p /home/vagrant/Code"override.vm.provision :shell, inline: "mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` Code /home/vagrant/Code", run: "always"else
override.vm.synced_folder "./Code", "/home/vagrant/Code"end

v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/Code", "1"]
end
# this should be inserted right before the "Homestead.configure()" lineHomestead.configure(config, YAML::load(File.read(homesteadYamlPath)))

if File.exists? afterScriptPath then
config.vm.provision "shell", path: afterScriptPath
end
end

И я также прокомментировал три строки, которые вы указали в моем файле Homestead.yaml:

---
ip: "192.168.10.10"memory: 2048
cpus: 1
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
- ~/.ssh/id_rsa

# folders:
#    - map: ~/Code
#      to: /home/vagrant/Code

sites:
- map: expimo.app
to: /home/vagrant/Code/Wordpress
- map: laravel.app
to: /home/vagrant/Code/laravel/public

databases:
- homestead

variables:
- key: APP_ENV
value: local

К сожалению, тогда я получаю сообщение об ошибке:

Не указан входной файл, потому что кажется, что URI не направлены в нужную папку.

Если затем я просто раскомментирую три строки в моем файле homestead.yaml и сохраню измененный файл Vagrantfile, я получу ту же ошибку, когда пытаюсь установить gulp-uncss через «npm install gulp-uncss —save-dev» ,

Что я должен делать дальше?

1

Решение

Я тот, кто реализовал это исправление, которое вы упомянули. 🙂

Лично я еще не сталкивался с этой проблемой с Homestead, но думаю, что знаю, что тебе нужно сделать. Во-первых, вам нужно закомментировать эти строки в Homestead.yaml файл:

folders
- map: ~/Code
to:  /home/vagrant/Code

Далее вам нужно добавить эту конфигурацию в ваш Vagrantfile:

# this should be inserted right before the "Homestead.configure()" line
config.vm.provider "virtualbox" do |v, override|
if Vagrant::Util::Platform.windows?
override.vm.synced_folder "./Code", "/home/vagrant/Code", disabled: true

v.customize ["sharedfolder", "add", :id, "--name", "Code", "--hostpath", (("//?/" + File.dirname(__FILE__) + "/Code").gsub("/","\\"))]

override.vm.provision :shell, inline: "mkdir -p /home/vagrant/Code"override.vm.provision :shell, inline: "mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` Code /home/vagrant/Code", run: "always"else
override.vm.synced_folder "./Code", "/home/vagrant/Code"end

v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/Code", "1"]
end
# this should be inserted right before the "Homestead.configure()" line

Обратите внимание на комментарии в предыдущем блоке; Вы должны убедиться, что он вставлен до запуска конфигурации Homestead.

ПРИМЕЧАНИЕ. В этом сценарии предполагается, что вы используете каталог «Код», который находится в том же каталоге, что и этот файл Vagrantfile.

2

Другие решения

Я подготовил полное руководство / пошаговое руководство для Homestead по Windows, в котором рассматриваются все эти проблемы (и другие, такие как проблемы с кэшированием в winnfsd / etc) и решения для Laravel 5. & Lumen. Я буду держать этот Гист в актуальном состоянии (и постоянно улучшать его читабельность). Вы можете найти суть здесь: https://gist.github.com/prograhammer/9493ee04f30dd74e121b

В этом Гисте мне пришлось добавить несколько шагов к решению Дэвида Майерса:

Обновить C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.2\plugins\providers\virtualbox\driver\version_4_3.rb где-то рядом с линиями 495-510, замените линию folder[:hostpath] с '\\\\?\\' + folder[:hostpath].gsub(/[\/\\]/,'\\')]

Обновить C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.2\lib\vagrant\util\platform.rb и закомментируйте большую часть этого раздела:

# This expands the path and ensures proper casing of each part
# of the path.

def fs_real_path(path, **opts)

#path = Pathname.new(File.expand_path(path))
#
# if path.exist? && !fs_case_sensitive?
#  # Build up all the parts of the path
#  original = []
#  while !path.root?
#    original.unshift(path.basename.to_s)
#    path = path.parent
#  end
#
#  # Traverse each part and join it into the resulting path
#  original.each do |single|
#    Dir.entries(path).each do |entry|
#     if entry.downcase == single.encode('filesystem').downcase
#       path = path.join(entry)
#     end
#    end
#  end
#end
#
# if windows?
#  # Fix the drive letter to be uppercase.
#  path = path.to_s
#  if path[1] == ":"#    path[0] = path[0].upcase
#  end
#
#  path = Pathname.new(path)
#end

path
end

Сейчас бродяга вверх.

2

По вопросам рекламы [email protected]