"Tambah sebagai Tautan" untuk folder di proyek Visual Studio


128

Di Visual Studio, kita bisa "Tambah sebagai tautan" untuk menambahkan tautan ke file di proyek lain dalam solusi.

Apakah ada cara untuk melakukan ini untuk seluruh folder, sehingga seluruh folder dalam proyek A akan terlihat di proyek B, tanpa perlu menautkan secara manual ke item baru di folder itu?

Jawaban:


142

Seperti yang dinyatakan blogpost ini , itu mungkin.

<ItemGroup>
    <Compile Include="any_abs_or_rel_path\**\*.*">
        <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
</ItemGroup>

Namun perlu diperhatikan, file tidak akan disalin.


18
+1. Anda juga bisa menggunakan <Content ...>, dan menambahkan <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>untuk membuat Visual Studio menyalin sumber daya di build.
Markus Jarderot

8
Coba gunakan: <None>...</None>alih-alih <Compile>...</Compile>. Tapi saya pikir, itu akan menyalin file-file itu pula. Bahkan VisualStudio melakukan ini dengan file yang ditautkan.
mo.

4
@mo. jawaban Anda menambahkan tautan ke semua file di root proyek, kadang-kadang tidak nyaman. % (RecursiveDir) harus diubah menjadi beberapa nama folder tautan: misalnya untuk menautkan folder sumber dari proyek wp7 'MyMainProject' di proyek lain dalam solusi ini: <ItemGroup> <Kompilasi Sertakan = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> Mesin <Link> \% (Nama File) </Link> </Compile> </ItemGroup>
Tertium

24
Saya harus menggunakan <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>untuk mencegahnya menjatuhkan ekstensi dari nama file.
Joe Daley

2
Untuk Sumber Daya Ikon Png: <EmbeddedResource Sertakan = ".. \ .. \ Ikon \ 16 * .png">
ChrisB

126

Di VS2012 dan yang lebih baru, Anda dapat menyeret folder ke proyek lain dengan menekan tombol alt . Sama seperti menambahkan setiap file sebagai tautan secara manual tetapi lebih cepat.

upd : Pertimbangkan untuk menggunakan Proyek yang Dibagikan jika Anda menggunakan pembaruan VS2013 2 (dengan Manajer Referensi Proyek yang Dibagikan ) atau VS2015.


1
Di VS2010, melakukan ini akan menyalin file dan direktori daripada menambahkannya sebagai tautan, membuat duplikat yang tidak diinginkan.
Tom

3
Catatan: folder harus diseret dari windows explorer (bukan instance lain dari studio visual). Selain itu, harus berupa seret klik kiri, bukan seret klik kanan. Berfungsi bagus di VS2012.
davidpricedev

11
Saya pikir itu hanya membuat tautan ke setiap file di folder sumber, bukan tautan ke folder itu sendiri. Itu berarti bahwa jika Anda menambahkan file ke folder sumber, itu tidak akan ditautkan secara otomatis.
Johnny5

1
@ MauryMarkowitz, Anda harus menyeret folder dari proyek VS, bukan dari windows explorer atau yang lainnya.
mt_serg

1
@ MauryMarkowitz, solusi tunggal, dua proyek. Seret Folder1 dari Project1 ke Project2 dengan tombol alt ditekan. Setiap file dari Project1 / Folder1 akan ditambahkan ke Project2 / Folder1 sebagai tautan.
mt_serg

37

Satu tambahan untuk jawaban dari mo. dan komentar dari Marcus, jika Anda menautkan item konten, Anda harus menyertakan ekstensi file:

<ItemGroup>
  <Compile Include="any_abs_or_rel_path\**\*.*">
    <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Compile>
</ItemGroup>

apa ini <Compile ...dalam hal ini. Dalam kasus saya, saya perlu merujuk .tsfile ke proyek baru saya. bagaimana ini dilakukan. Terima kasih!
Rahmathullah M

23

Mengenai bagian dari permintaan asli untuk memiliki folder yang ditautkan muncul di IDE, itu agak mungkin untuk mencapai ini sehingga ada folder dalam solusi explorer dengan semua file yang terhubung di dalamnya, bukan semua file yang muncul di root dari solusinya. Untuk mencapai ini termasuk penambahan:

  <ItemGroup>
    <Compile Include="..\anypath\**\*.*">
      <Link>MyData\A\%(RecursiveDir)%(FileName)%(Extension)</Link>
    </Compile>
  </ItemGroup>

Ini akan mencakup semua file dari direktori tertaut di folder baru di penjelajah solusi yang disebut MyData. Tanda 'A' dalam kode di atas dapat disebut apa saja tetapi harus ada di sana agar folder tersebut dapat muncul.


tampaknya melakukan trik tetapi tidak melipat file Formulir menjadi satu, dan memberikan kesalahan untuk file .resx mereka (saya menggunakan VB). Bagaimanapun, terima kasih.
Ivan Ferrer Villa

1
@IvanFerrerVilla, ya ada beberapa masalah yang saya perhatikan, tetapi sebagian besar hanya bagus untuk tampilannya.
Adam

3
Dengan Visual Studio 2015, ini bekerja untuk saya bahkan tanpa `A`.
Martin

7

Jika Anda ingin menambahkan folder sebagai referensi dan Anda tidak ingin mengompilasinya gunakan:

<Content Include="any_path\**\*.*">
  <Link>folder_in_B_project\%(RecursiveDir)%(FileName)%(Extension)</Link>
</Content>

0

Hancurkan shell dan tambahkan tautan simbolik.

runas Administrator kemudian

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

Tautan simbolis BAM!

/ d menentukan tautan direktori.

Berfungsi di Vista di atas kotak. Dapat di-backport ke XP.

Dokumentasi di sini: http://technet.microsoft.com/en-us/library/cc753194%28WS.10%29.aspx

Bagi mereka yang tidak terbiasa dengan tautan simbolik, itu pada dasarnya adalah sebuah penunjuk ke file atau direktori lain. Ini transparan untuk aplikasi. Satu salinan di disk, beberapa cara untuk mengatasinya. Anda juga dapat membuat "tautan keras" yang bukan merupakan penunjuk ke alamat lain, tetapi entri ID file aktual di NTFS untuk file yang sama.

CATATAN: seperti yang dinyatakan dalam komentar, ini hanya akan bekerja di komputer tempat Anda membuat symlink dan tidak akan bekerja di Sistem Kontrol Versi seperti git.


2
Ini hanya akan berguna untuk satu pengembang (kecuali dituliskan). Solusi lain merupakan bagian dari kode sumber bersama sehingga lebih bermanfaat secara universal.
JRoughan

Pertanyaan yang diajukan bukan tentang kode sumber yang dibagikan. Yang mengatakan, msysgit tidak mendukung symlink, jadi payah.
John Vance

1
Ini bukan pertanyaan sistem file. Harap perhatikan juga bahwa ide ini akan mendorong efek samping yang serius dengan sistem kendali sumber yang berbeda dan sistem cadangan cadangan
g.pickardou

Tampaknya saya tidak diizinkan mengedit atau menghapus pertanyaan saya. Keberatan pertama Anda konyol. Pertanyaan itu juga tidak secara eksplisit merupakan pertanyaan pengeditan file proyek, jadi Anda harus mencatat semua jawaban juga. Keberatan kedua Anda dicatat, dan jika saya bisa mengedit jawaban saya untuk menambahkan peringatan itu, saya akan melakukannya.
John Vance
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.