"Adicionar como link" para pastas em projetos do Visual Studio


127

No Visual Studio, podemos "Adicionar como link" para adicionar um link a um arquivo em outro projeto na solução.

Existe alguma maneira de fazer isso para pastas inteiras, para que uma pasta inteira no projeto A fique visível no projeto B, sem a necessidade de vincular manualmente a novos itens nessa pasta?

Respostas:


141

Como este post do blog afirmou, é possível.

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

Mas esteja ciente, os arquivos não serão copiados.


18
+1. Você também pode usar <Content ...>e adicionar <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>para fazer o Visual Studio copiar os recursos na compilação.
Markus Jarderot

8
Tente usar: em <None>...</None>vez de <Compile>...</Compile>. Mas eu acho que ele copiará esses arquivos de qualquer maneira. Mesmo o VisualStudio faz isso com arquivos vinculados.
mo.

4
@mo. sua resposta adiciona links para todos os arquivos na raiz do projeto, às vezes é inconveniente. % (RecursiveDir) deve ser alterado para um nome de pasta de link: por exemplo, para vincular a pasta de origem do projeto wp7 'MyMainProject' em outro projeto nesta solução: <ItemGroup> <Compile Include = ".. \ .. \ MyMainProject \ MyMainProject \ engine *. * "> <Link> engine \% (FileName) </Link> </Compile> </ItemGroup>
Tertium

23
Eu tive que usar <Link>%(RecursiveDir)%(FileName)%(Extension)</Link>para impedir que ele soltasse as extensões dos nomes dos arquivos.
precisa

2
Para recursos Png do ícone: <EmbeddedResource Include = ".. \ .. \ Icons \ 16 * .png">>
ChrisB

126

No VS2012 e posterior, você pode arrastar uma pasta para outro projeto com a tecla alt pressionada. É o mesmo que adicionar cada arquivo como link manualmente, mas com mais rapidez.

upd : considere usar projetos compartilhados se estiver usando a atualização 2 do VS2013 (com o Gerenciador de referência de projeto compartilhado ) ou o VS2015.


1
No VS2010, fazer isso copiará arquivos e diretórios em vez de adicioná-los como links, criando duplicatas indesejadas.
Tom

3
Nota: a pasta deve ser arrastada do Windows Explorer (não outra instância do Visual Studio). Além disso, deve ser um arrasto com o botão esquerdo, não um arraste com o botão direito. Funciona muito bem no VS2012.
davidpricedev 31/01

11
Eu acho que apenas cria links para todos os arquivos na pasta de fontes, não um link para a própria pasta. Isso significa que, se você adicionar um arquivo à pasta de origem, ele não será vinculado automaticamente.
Johnny5

1
@MauryMarkowitz, você deve arrastar uma pasta do projeto VS, não do Windows Explorer ou qualquer outra coisa.
mt_serg

1
@MauryMarkowitz, solução única, dois projetos. Arraste a Pasta1 do Projeto1 para o Projeto2 com a tecla alt pressionada. Cada arquivo do Projeto1 / Pasta1 será adicionado ao Projeto2 / Pasta1 como link.
mt_serg

37

Uma adição à resposta do mo. e o comentário de Marcus, se você estiver vinculando itens de conteúdo, precisará incluir a extensão do arquivo:

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

o que é isso <Compile ...nisso. No meu caso, preciso consultar os .tsarquivos para o meu novo projeto. como isso é feito. obrigado!
Rahmathullah M

23

Em relação à parte da consulta original em que uma pasta vinculada é exibida no IDE, é possível fazer isso para que exista uma pasta no explorador de soluções com todos os arquivos vinculados dentro, em vez de todos os arquivos que aparecem na raiz do IDE. a solução. Para conseguir isso, inclua a adição:

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

Isso incluirá todos os arquivos do diretório vinculado em uma nova pasta no gerenciador de soluções chamada MyData. O 'A' no código acima pode ser chamado de qualquer coisa, mas deve estar lá para que a pasta apareça.


parece fazer o truque, mas não dobra os arquivos de formulário em um e gera erros para os arquivos .resx (estou usando o VB). Obrigado mesmo assim.
Ivan Ferrer Villa

1
@IvanFerrerVilla, sim, tenho alguns problemas que eu notei, mas na maioria das vezes é bom apenas para a aparência.
Adam

3
Com o Visual Studio 2015, isso funcionou para mim mesmo sem o `A '.
Martin

7

Se você deseja adicionar uma pasta como referência e não deseja compilá-la, use:

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

0

Estique o casco e adicione um link simbólico.

runas Administrator então

mklink /d LinkToDirectory DirectoryThatIsLinkedTo

Link simbólico BAM!

/ d especifica o link do diretório.

Funciona no Vista, pronto para uso. Pode ser portado para o XP.

Documentação aqui: http://technet.microsoft.com/en-us/library/cc753194%28WS.10%29.aspx

Para aqueles que não estão familiarizados com links simbólicos, é essencialmente um ponteiro para outro arquivo ou diretório. É transparente para aplicativos. Uma cópia no disco, várias maneiras de resolvê-lo. Você também pode criar um "link físico" que não é um ponteiro para outro endereço, mas uma entrada real de identificação de arquivo no NTFS para o mesmo arquivo.

NOTA: conforme declarado nos comentários, isso funcionaria apenas no computador em que você criou o link simbólico e não funcionaria em um sistema de controle de versão como o git.


2
Isso seria útil apenas para um único desenvolvedor (a menos que com script). As outras soluções fazem parte do código-fonte compartilhado, portanto são mais universalmente úteis.
precisa saber é o seguinte

A pergunta feita não era sobre código-fonte compartilhado. Dito isto, o msysgit não suporta links simbólicos, portanto, que chatice.
John Vance

1
Esta não é uma pergunta do sistema de arquivos. Também observe essa idéia irá conduzir sério efeito colateral com diferentes sistemas de controle de origem e sistemas resore de backup
g.pickardou

Aparentemente, não tenho permissão para editar ou excluir minha pergunta. Sua primeira objeção é boba. A questão também não era explicitamente uma questão de edição de arquivo de projeto, portanto, você deve reduzir também todas essas respostas. Sua segunda objeção é anotada e, se eu pudesse editar minha resposta para acrescentar essa ressalva, eu o faria.
John Vance
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.