Vagrant - paver devstack错误:" [Errno 20]不是目录"

时间:2015-11-06 07:55:06

标签: git vagrant devstack edx openedx

我正在尝试使用Vagrant安装edx Devstack,而且我正在使用Windows计算机。我收到的错误似乎是由Windows不支持的符号链接造成的。

根据Dealing with line endings and symlinks under Windows下的edx故障排除指南,我应该在cygwin中运行以下命令来处理符号链接。

git rm --cached -r . && git reset --hard

git config --global alias.add-symlink '!__git_add_symlink(){
    dst=$(echo "$2")/../$(echo "$1"); 
    if [ -e "$dst" ]; then 
        hash=$(echo "$1" | git hash-object -w --stdin); 
        git update-index --add --cacheinfo 120000 "$hash" "$2"; 
        git checkout -- "$2"; 
    else 
        echo "ERROR: Target $dst does not exist!"; 
        echo "       Not creating invalid symlink."; 
    fi; 
    }; __git_add_symlink "$1" "$2"'

git config --global alias.rm-symlink '!__git_rm_symlink(){
    git checkout -- "$1"; link=$(echo "$1"); 
    POS=$'\''/'\''; DOS=$'\''\\\\'\''; 
    doslink=${link//$POS/$DOS}; 
    dest=$(dirname "$link")/$(cat "$link"); 
    dosdest=${dest//$POS/$DOS}; 
    if [ -f "$dest" ]; then 
        rm -f "$link"; 
        cmd //C mklink //H "$doslink" "$dosdest"; 
    elif [ -d "$dest" ]; then 
        rm -f "$link"; 
        cmd //C mklink //J "$doslink" "$dosdest"; 
    else 
        echo "ERROR: Something went wrong when processing $1 . . ."; 
        echo "       $dest may not actually exist as a valid target."; 
    fi; 
    }; __git_rm_symlink "$1"'

git config --global alias.rm-symlinks '!__git_rm_symlinks(){
    for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; 
    do 
        git rm-symlink "$symlink"; 
        git update-index --assume-unchanged "$symlink"; 
    done; 
    }; __git_rm_symlinks'

git config --global alias.checkout-symlinks '!__git_checkout_symlinks(){
    POS=$'\''/'\''; DOS=$'\''\\\\'\''; 
    for symlink in `git ls-files -s | grep -E "^120000" | cut -f2`; 
    do 
        git update-index --no-assume-unchanged "$symlink"; 
        if [ -d "$symlink" ]; then 
            dossymlink=${symlink//$POS/$DOS}; 
            cmd //C rmdir //S //Q "$dossymlink"; 
        fi; 
        git  checkout -- "$symlink"; 
        echo "Restored git symlink $symlink <<===>> `cat $symlink`"; 
    done; 
    }; __git_checkout_symlinks'

git rm-symlinks

我还尝试了回答Git symlinks in Windows的SO中的命令,这会产生相同的结果。

输出:

运行上述命令后得到的输出有点奇怪,所以我不确定脚本是否成功。

User@Computer /cygdrive/c/.../Local/devstack/edx-platform/edx-platform $./symlinks-fix.sh
**Git checkout output**
...
Checking out files: 100% (6983/6983), done.
HEAD is now at 222bdd9 Merge pull request #10411 from edx/mobile/course-blocks-api

Microsoft Windows [Version 6.2.9200]
(c) 2012 Microsoft Corporation. All rights reserved.

C:\Users\...\Local\devstack\edx-platform\edx-platform>

为什么最后会进入Windows风格的命令提示符?这是我不确定git命令是否正常工作的地方。

在Vagrant中:

运行vagrant upvagrant ssh后,运行paver devstack lms时出现以下错误(paver devstack studio的类似输出):

vagrant@precise64:~$ sudo su edxapp
edxapp@precise64:~/edx-platform$ paver devstack lms
...
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/github.txt
  Could not find a tag or branch '96e1922348bfe6d99201b9512a9ed946c87b7e0b', assuming commit.
  .... 20 similar ....
  Could not find a tag or branch 'e7a6c95c300e95c51e42bfd1eba70489c05a6527', assuming commit.

pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/local.txt
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/base.txt
  Requested meliae==0.4.0 (from -r requirements/edx/base.txt (line 47)), but installing version 0.4.0.final.0
pip install -q --disable-pip-version-check --exists-action w -r requirements/edx/post.txt
python manage.py cms --settings=devstack reindex_course --setup
2015-11-06 01:37:40,353 WARNING 4797 [xblock.plugin] plugin.py:147 - Unable to load XBlock 'html'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
2015-11-06 01:37:40,660 WARNING 4797 [xblock.plugin] plugin.py:147 - Unable to load XBlock 'course_info'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback ...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'
    Traceback ...
IOError: [Errno 20] Not a directory: '/edx/app/edxapp/edx-platform/common/lib/xmodule/xmodule/js/common_static/js/vendor/draggabilly.pkgd.js'

Build failed running pavelib.servers.devstack: Subprocess return code: 1

根据我的理解,这是符号链接的问题(请参阅Google群组上的this帖子)。

我是否正确运行上述符号链接脚本?如何检查符号链接是否已成功处理?

其他尝试:

根据谷歌小组中的建议(上面的链接),我也进行了以下调整:

  • 设置VAGRANT_USE_VBOXFS = true
  • 使用提供的Vagrantfile here
  • 设置环境变量OPENEDX_RELEASE =&#34; named-release / cypress&#34;
  • 从Vagrant实例安装libxmlsec1。

在多个vagrant destroyvagrant provision之后,我仍然遇到相同的IOError: [Error 20] Not a directory问题。任何帮助将不胜感激!

版本:

  • Windows版本:8
  • Vagrant版本:1.7.4
  • VirtualBox版本:5.0.8
  • openEdx发布:named-release / cypress

1 个答案:

答案 0 :(得分:3)

我认为问题是由你的cydrive路径错误引起的。

尝试更改c:\cygwin\etc\fstab

none /cydrive cygdrive binary,posix=0,user 0 0

none / cygdrive binary,posix=0,user 0 0

参考:https://cygwin.com/cygwin-ug-net/using.html#cygdrive

<强>更新

来自CMD Type&#39; bash&#39;然后复制/粘贴脚本的内容

如果得到相同的结果,请尝试:

打开.gitconfig(使用Notepad ++或类似内容)并添加此部分(如果尚未存在)

[alias]
add-symlink = "!__git_add_symlink(){\n    dst=$(echo \"$2\")/../$(echo \"$1\"); \n    if [ -e \"$dst\" ]; then \n        hash=$(echo -n \"$1\" | git hash-object -w --stdin); \n        git update-index --add --cacheinfo 120000 \"$hash\" \"$2\"; \n        git checkout -- \"$2\"; \n    else \n        echo \"ERROR: Target $dst does not exist!\"; \n        echo \"       Not creating invalid symlink.\"; \n    fi; \n    }; __git_add_symlink \"$1\" \"$2\""
rm-symlink = "!__git_rm_symlink(){\n    git checkout -- \"$1\"; link=$(echo \"$1\"); \n    POS=$'/'; DOS=$'\\\\\\\\'; \n    doslink=${link//$POS/$DOS}; \n    dest=$(dirname \"$link\")/$(cat \"$link\"); \n    dosdest=${dest//$POS/$DOS}; \n    if [ -f \"$dest\" ]; then \n        rm -f \"$link\"; \n        cmd //C mklink //H \"$doslink\" \"$dosdest\"; \n    elif [ -d \"$dest\" ]; then \n        rm -f \"$link\"; \n        cmd //C mklink //J \"$doslink\" \"$dosdest\"; \n    else \n        echo \"ERROR: Something went wrong when processing $1 . . .\"; \n        echo \"       $dest may not actually exist as a valid target.\"; \n    fi; \n    }; __git_rm_symlink \"$1\""
rm-symlinks = "!__git_rm_symlinks(){\n    for symlink in `git ls-files -s | grep -E \"^120000\" | cut -f2`; \n    do \n        git rm-symlink \"$symlink\"; \n        git update-index --assume-unchanged \"$symlink\"; \n    done; \n    }; __git_rm_symlinks"
checkout-symlinks = "!__git_checkout_symlinks(){\n    POS=$'/'; DOS=$'\\\\\\\\'; \n    for symlink in `git ls-files -s | grep -E \"^120000\" | cut -f2`; \n    do \n        git update-index --no-assume-unchanged \"$symlink\"; \n        if [ -d \"$symlink\" ]; then \n            dossymlink=${symlink//$POS/$DOS}; \n            cmd //C rmdir //S //Q \"$dossymlink\"; \n        fi; \n        git  checkout -- \"$symlink\"; \n        echo \"Restored git symlink $symlink <<===>> `cat $symlink`\"; \n    done; \n    }; __git_checkout_symlinks"

这将为符号链接创建一些git命令

注意:文件使用Unix行结尾,不用Windows记事本编辑!

然后执行命令

git rm --cached -r .
git reset --hard
git rm-symlinks

我在我的环境中测试了它并且它可以正常工作