Vagrant'ta sembolik bağlantılar ve senkronize edilmiş klasörler


99

Ekibime ortak bir geliştirme ortamı sağlamak için Vagrant'ı kullanmak istiyorum. Ana bilgisayarlar tamamen farklı:

  • Bazıları OS X, bazıları Linux ve bazıları Windows kullanır.
  • Bazıları VMware kullanıyor, bazıları VirtualBox kullanıyor.

VM'nin içinde Linux çalıştırmak istiyoruz.

Şimdiye kadar her şey yolunda.

Şimdi bizim fikrimiz, her geliştiricinin kendi seçtikleri IDE'yi kullanabileceğiydi ve bu nedenle, kaynak kodunu ana bilgisayar ve VM arasında paylaşan senkronize bir klasör başlattık. Bu temelde işe yarar… sembolik bağlantılar dışında.

Kaynak kodumuzun içinde aslında birkaç sembolik bağlantı var, bu VM içindeki Linux içinde bir sorun değil, ancak Windows'ta ana bilgisayar olarak bu sorunlara neden oluyor. Biz görebileceği tek şey değil bu başa Başka bir yol bulmalıyız, böylece sembolik linkleri kurtulmak yoktur.

Şimdiye kadar bir dizi seçeneği denedik:

  • Vagrant'ın bir sayısında bahsedilen bir geçici çözüm var , ne yazık ki bu sadece VirtualBox içindir ve VMware çalıştıranlara yardımcı olmamaktadır. Şimdiye kadar, kullanılan sağlayıcıya bağlı olarak Vagrantfile'da kod çalıştırmanın bir yolunu bulamadık .
  • Standart bir paylaşımlı klasör kullanmak yerine şimdi rsync tipini kullanmayı denedik . Bu, Windows'ta çalışır, ancak OS X'te bir dizi hatayla çöker bize şunu söyler symlink has no referent(sembolik bağlantı başına bir hata).
  • NFS hakkında düşündük , ancak bu yalnızca Windows'u ana bilgisayar olarak kullanmıyorsanız işe yarar.
  • Ayrıca SMB hakkında da düşünüyoruz , ancak bu yine yalnızca Windows'ta ana bilgisayar olarak çalışıyor.

Bu gezegende çok platformlu ana bilgisayarlar ve paylaşılan klasördeki sembolik bağlantılar ile sorunlar yaşayan tek veya ilk kişi olduğumuzu hayal edemiyorum.

Bu sorunu nasıl çözebilirsiniz, böylece sembolik bağlantıları koruyabiliriz, ancak yine de farklı ana bilgisayar işletim sistemleri kullanabiliriz?



@SteveBennett, bu sorun (mevcut kabul edilen cevap referanslarıdır) OP'nin soruyu göndermesinden 15 ay önce yayınlanan Vagrant 1.1'de çözüldü. Ve yine de VirtualBox paylaşılan klasörleri ile ilgili, rsync edilmiş klasörlerle değil. Aşağıdaki cevabıma bakın (kabul edilen cevap yanlıştır).
önemsiz

Yanıtlar:


66

Virtualbox, güvenlik nedeniyle paylaşılan klasörlerde sembolik bağlantılara izin vermez. Sembolik bağları etkinleştirmek için aşağıdaki satırın Vagrantfile'daki vm sağlayıcı yapılandırma bloğuna eklenmesi gerekir:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

Ek olarak, Windows'ta vagrant up'ın yönetici haklarına sahip bir kabukta çalıştırılması gerekir. Geçici çözümlere gerek yok.


9
OP'nin ve bu soruyu görüntüleyen birçok kişinin "paylaşılan" ve "senkronize" terimini birbirinin yerine kullandığından şüpheleniyorum. OP'nin paylaşılan klasörleri kullandığını, ancak çalışmadıkları için senkronize edilmiş bir klasöre geçmeyi denediğini kuvvetle ima eden ikinci madde işaretine dikkat edin. IIRC, burada sunulan çözüm, her halükarda sahip olduğum sorunu çözdü.
Steve Bennett

2
@SteveBennett, potansiyel kafa karışıklığı konusunda hemfikir. Açıklığa kavuşturmak için daha fazla neden. Serserinin oldukça eski bir sürümünü kullanmadığınız sürece, bu önerinin bu kadar eski [uzun zamandır çözülmüş] bir soruna atıfta bulunulduğunda sorununuzu çözeceğini hayal etmek zor. Ve öyle olsa bile, IMO'nun, paylaşılan dizinler için VBox'ın berbat dosya sistemi performansını (örneğin, "git durumu" birkaç saniye sürer) göz önünde bulundurulduğunda çok az yardımı olurdu, ancak çok az dosya içeren sadece küçük bir projeyi paylaşıyor olabilirsiniz. mitchellh.com/…
önemsiz

5
vagrant upYönetici haklarına sahip bir kabukta çalıştırmak gerekli olan tek şeydir. @Jdunk belirttiği gibi itibariyle bu yapılandırma seçeneği zaten Vagrant varsayılan olarak ayarlanır işlemek bu Bu cevap yayınlanmıştır önce neredeyse bir yıl oldu hangi. Bununla vagrant upbirlikte, yönetici haklarına sahip bir kabukta çalıştırmak sorunumu çözdü.
Ajedi32

2
Soruya cevap vermiyor. Senkronize klasörler üzerinde çalışmıyor.
Manel

Bu cevap 2 ana nedenden dolayı yanlıştır. 1. VBox paylaşımlı klasörleri ifade eder, senkronize edilmiş dizinlere değil - tamamen farklı iki şey. 2. Bu ayar, OP'nin sorusundan 15 ay önce yayınlanan Vagrant 1.1'de zaten bir varsayılandı. Daha fazla bilgi için aşağıdaki cevabıma bakın.
önemsiz

94

Kabul edilen cevap iyi değil. Soru , paylaşılan klasörlerle değil , senkronize klasörlerle ilgili bir sorunu açıklar . Önerilen çözümün yeniden senkronize edilmiş ( paylaşılmayan ) bir klasör üzerinde hiçbir etkisi olmayacaktır . Ve OP paylaşılan bir klasör kullanıyor olsa bile , kabul edilen cevabın önerisi, OP'nin soruyu göndermesinden 15 ay önce yayınlanan 1.1'den itibaren serseriye entegre edilmiş bir şeydir ( VirtualBox'ın paylaşılan klasörlerinin aşırı derecede yavaş olduğundan bahsetmiyorum bile ).


Aynı sorunla karşılaştım: OS X'te symlink has no referentrsync hatası aldım . Ben şahsen bunu, şu dosyama belirli rsync argümanları ekleyerek çözebildim vagrantfile:

config.vm.synced_folder ".", "/var/www", type: "rsync", rsync__args: ["--verbose", "--archive", "--delete", "-z"]

Ayrıca bu konuyu vagrant'ın github'ında, varsayılan değerlerinde yanlış görünen bir şeye işaret etmek için açtımrsync__args (özellikle, varsayılan bağımsız değişkenlerden biri, en azından bozuk sembolik bağları kopyalamak söz konusu olduğunda, --copy-linksdiğerini bozuyor gibi görünüyor. --archive).


İyi çağrı - teşekkürler @jdunk. Evet, Vagrant belgelerine göre --copy-linksseçenek varsayılan olarak ayarlanmıştır. Bu benim sorunumdu. Bunu kaldırarak (yukarıdaki cevabınızı kullanarak) - bu onu halleder.
Phil Birnie

1
Çok faydalı, teşekkürler. Yine de Windows alternatifini isterdim.
Aleksandr Makov

4
Vagrant belgelerine göre, Paylaşılan klasörlerin VirtualBox kullanıcıları için varsayılan eşitlenmiş klasör türü olduğunu unutmayın: "VirtualBox sağlayıcısını kullanıyorsanız, o zaman VirtualBox paylaşılan klasörleri varsayılan eşitlenmiş klasör türüdür." ( docs.vagrantup.com/v2/synced-folders/virtualbox.html ) OP'nin sorusu, VirtualBox paylaşılan klasörlerinin de bir endişe olduğunu ima ediyor gibi görünüyor, bu nedenle kabul edilen yanıt sorunun en azından bir kısmını ele almaya çalışıyor (ve gerçekten sorunu benim için düzelt).
Ajedi32

Kıçımı kurtardığın için çok teşekkür ederim, internetin her yerine baktım ve sonunda bu sorunu anlayan biri!
Dovizu

1
Teşekkür ederim. Sorunumu çözen şey buydu (başlıktaki ve buraya bir çözüm aradığım ve kafa karıştırıcı bir şekilde sorulan soru değil).
johncip

7

Çalışan bir hatayı çözmek için tüm bu seçenekleri denedim npm install.

Bir yönetici isteminde serseri çalıştırmak ve vm ( vagrant reload) yüklemek sorunu çözdü.

Geri döndüm ve SharedFoldersEnableSymlinksCreateyapılandırmayı Vagrantfile'dan kaldırdım ve her şey hala yolundaydı.


npm updateserseri paylaşılan klasörümde çalışmıyordu. Bu çözüm onu ​​bir sebepten düzeltti.
Emre

1
Daha fazla araştırmadan sonra, sembolik bir bağlantı oluşturmanın varsayılan olarak pencerelerde yönetici izni gerektirdiği ortaya çıktı. İzinleri değiştirmek için, buradaki yanıta bakın: superuser.com/a/125981
gameweld

Vagrant'ı ve Windows 10 makinesinde Yönetici olarak komut istemini çalıştırmak, benim için npx create-react-app 'project_name' üzerinde çalıştı.
sybozz

2

Varsayılan eşitlenmiş klasör türü, vboxsfçok sayıda dosya / dizinle bilinen bir performans sorununa sahiptir ve sembolik bağlantılar ve sabit bağlantılar için destekten yoksundur (bkz. Bilet 818 - 7+ yıllık bir hata). Kullanmaktan kaçının.

rsync türü eşitlenmiş klasör en iyi seçiminiz olabilir.

Kilitlendiğinden bahsettiniz, hangi rsync sürümünü çalıştırıyorsunuz? Demleme yoluyla 3.1.0'a güncellemeyi deneyin, OOTB'nin çok eski olduğunu (2.x) biliyorum, bu da sorunlara neden olabilir.


[wdd@localhost ~]$ sudo mount -t rsync node share mount: unknown filesystem type 'rsync'
Musa Haidari

1
Bu cevabı okuduğumda, problemimi çözeceğini düşündüğümde mutlu oldum ama sudo mount -t rsync shared /var/wwwhatayı yaptığımda yukarıdakiyle aynı şeyi alıyorummount: unknown filesystem type 'rsync'
samayo

rsyncasla bir dosya sistemi türü değildir, bu nedenle onu bağlayamazsınız.
Terry Wang

@samyo bakınız vagrantup.com/docs/synced-folders/rsync.html içeri yapılandırmak gerekir Vagrantfileve elle işletilen vagrant rsyncveya vagrant rsync-auto. Aksi takdirde, yalnızca açılırken ve yeniden yüklenirken senkronize edilir.
Terry Wang

1

Bir saat uğraştıktan ve birkaç farklı çözümü denedikten sonra ( vagrant-vbguestMarvin'in önerdiği düzeltme), VirtualBox 4.8.10, Vagrant 1.5.1 ile çalışmak için paylaşılan klasörlerde sembolik bağlantılar alamadım.

Daha basit bir çözümün ayrı bir paylaşılan klasör yapılandırmak olduğunu ve ardından File.readlinkalttaki yolu okumak için Ruby'leri kullanmak olduğunu buldum :

config.vm.synced_folder File.readlink('SYMLINK'), "/mount/path"

1
Ben anlamadım Bir örnekle açıklar mısınız? Teşekkürler
Cassiano

0

Aşağıdaki satırı Vagrantfile'a ekleyin:

config.vm.provider "virtualbox" do |v|
    v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
end

Bu, SADECE sanal kutuyu 6.0.8'e 6.0.4'e ve serseri 2.2.4'ü 2.2.1'e düşürdükten sonra benim için çalıştı .

Terminali açtığınızda (Windows 10'da git bash kullanıyorum) "Yönetici Olarak Çalıştır" ile.

git bash değiştirmeyi de deneyin: proje dosyasında: $ vim .git / config symlinks = true olarak değiştirin

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = true
        ignorecase = true
[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.