【问题标题】:Configuring Homestead to work for Windows Users将 Homestead 配置为适用于 Windows 用户
【发布时间】:2015-05-07 02:01:44
【问题描述】:

编辑:请参阅下面的更新部分,我根据给定的解决方案建议修改了代码

我在我的 win7 机器上使用 vagrant with homestead。我想安装一些 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 中,这样 homestead 可以在 windows 下正常工作。

由于我刚开始使用 vagrant,我的知识非常有限,因此我欢迎任何关于此主题的帮助。提前谢谢你。

更新

David Myers 建议的更新:

我根据下面的 David Myers 建议修改了我的 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()" line



    Homestead.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,当我尝试通过“npm install gulp-uncss --save”安装 gulp-uncss 时,我会收到同样的错误-dev”。

接下来我该怎么做?

【问题讨论】:

    标签: php laravel vagrant virtual-machine homestead


    【解决方案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
    

    注意前一个块中的 cmets;您需要确保在运行 Homestead 配置之前将其插入。

    注意:此脚本假定您正在共享一个名为“代码”的目录,该目录与此 Vagrantfile 位于同一目录中。

    【讨论】:

    • 嗨,大卫,感谢您的努力。不幸的是,解决方案似乎并不那么简单,因为它仍然不起作用。我更新了上面的条目以反映您的建议。
    • 您介意告诉我共享目录在您机器上的位置吗?
    • 就在 C:/Users/Georg/Code Proof:imgur.com/IYLqPEp,lGE9f4Z,d7ak6vQ
    • 您是否碰巧更改了我发布的代码以反映这一点?上面的代码在您调用“vagrant up”的同一目录中查找“代码”目录。如果它位于不同的目录中,您可能需要更改上面的代码以反映这一点。
    【解决方案2】:

    我为 Windows 上的 Homestead 提供了完整的指南/演练,解决了所有这些问题(以及其他问题,例如 winnfsd/etc 的缓存问题)以及 Laravel 5 和 Lumen 的解决方案。我将保持这个 Gist 是最新的(并不断提高它的可读性)。你可以在这里找到要点:https://gist.github.com/prograhammer/9493ee04f30dd74e121b

    在该要点中,我必须向 David Myers 解决方案添加几个步骤:

    在第 495-510 行附近更新 C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.2\plugins\providers\virtualbox\driver\version_4_3.rb,将 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
    

    现在流浪起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 2021-12-10
      • 1970-01-01
      • 2012-07-17
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多