Cartella delle soluzioni di Visual Studio come cartelle reali


120

Ho una soluzione Visual Studio. Attualmente è una soluzione vuota (= nessun progetto) e ho aggiunto alcune cartelle di soluzioni.

Le cartelle della soluzione sembrano essere solo "cartelle virtuali", perché non sono realmente create nel filesystem e i file all'interno delle cartelle della soluzione si trovano solo nella stessa cartella del file .sln.

C'è un'impostazione che ho trascurato che dice a Visual Studio di trattare le cartelle della soluzione come cartelle "reali", ovvero crearle nel file system e spostare i file al suo interno quando le sposto all'interno della soluzione in una di quelle cartelle?

Modifica: grazie. Vado a dare un suggerimento per VS2010 quindi :)


52
Questa è una delle stranezze più fastidiose di Visual Studio
Andy White

Come posso affrontare correttamente questa stranezza?
hellboy

La cosa divertente, Rider ha questa caratteristica (ma la cartella deve essere nello stesso percorso del file .sln e il riferimento effettivo alla cartella non è memorizzato nel file .sln stesso): jetbrains.com/help/rider/Extending_Your_Solution. html
rsenna

Sto usando VS 2017 e per quanto ne so, MS non ha ancora aggiunto una funzionalità per consentire l'aggiunta di intere cartelle a una cartella della soluzione: è necessario aggiungere singoli file.
Theo

Risposte:


43

Nessun ambiente speciale. Non credo sia supportato.

È possibile creare cartelle reali in un "progetto" all'interno della soluzione, ma non nella soluzione stessa.


1
Questo sembra ancora essere accurato a partire da VS 2017.
Theo

2
... e VS 2019
qualunque cosa il

una delle cose peggiori di VS. Perché MS non mantiene le cartelle Sln come opzione, ma consente ANCHE di aggiungere cartelle REALI alla soluzione. Così fastidioso. Il File System funziona, perché reinventare la ruota (come un quadrato).
MemeDeveloper

46

C'è una soluzione alternativa che si comporta effettivamente come previsto .

  1. Aggiungere un sito Web nuovo o esistente alla soluzione. (Di solito ne creo uno nuovo.)
  2. Assicurati solo che sia creato all'interno della cartella della soluzione. (A volte creo anche un "collegamento" a una cartella esterna, ad es. "Documenti" o "Marketing" su una condivisione di rete. In tal caso viene ignorato da Git, ovviamente.)
  3. Assicurati di andare alle impostazioni "Progetto" o Configuration Manager per escludere questo "Sito Web" da Build and Deploy !

Fatto. Ora Solution Explorer rifletterà qualsiasi modifica nel file system e viceversa (comprese le sottocartelle).

Lo uso (mi manca) per specifiche, documenti, PM e alcuni script DevOps condivisi all'interno del team. È facile scegliere cosa includere o meno nel controllo del codice sorgente e (se impostato correttamente) non è in conflitto con la build.

So che la funzione non è intesa per quel caso d'uso, ma a parte l'icona forse fuorviante "Progetto" non ho ancora trovato alcuna carenza in quell'hack. E ci sono ancora casi d'uso in cui le classiche cartelle di soluzioni (virtuali) fornite da VS si adattano all'immagine. Cosa ne pensi?


4
Ecco le istruzioni complete: Fare clic con il pulsante destro del mouse sulla soluzione -> "Aggiungi" -> "Nuovo sito Web ..." -> (ho scelto "Sito Web vuoto ASP.NET"). Dopo aver cambiato la posizione, non dimenticare di aggiungere "\ MyName" al percorso, altrimenti facendo clic su "OK" si riaprirà semplicemente la finestra di dialogo. Dopo di che fai clic con il pulsante destro del mouse sulla tua soluzione -> "Proprietà" -> "Proprietà di configurazione" -> deseleziona "Crea" per il progetto web.
user764754

Funziona ancora? usando VS2015 ma non funziona.
Jan Paolo Go

In VS2017 crea perfettamente una cartella reale ma l'icona del sito Web (cerchio scuro) viene visualizzata in Esplora soluzioni. Qualcuno sa come risolverlo?
Andrei Karcheuski

Sì, funziona in VS2019, ma ancora non monitora le modifiche al filesystem. Occasionalmente è necessario "Aggiorna" per visualizzare i file correnti. Se solo i progetti C # non fossero l'unico tipo di soluzione a supportare il nuovo .*projformato basato su file system, più pulito e chiaro .
Shannon,

33

In Visual Studio 2017, fare clic sull'icona "Soluzioni e cartelle" nella finestra Esplora soluzioni. Questo pulsante commuta dalla vista virtuale "soluzione" a una "vista sorgente" che corrisponde al layout di cartelle e file sul file system. Quando si aggiunge una nuova cartella, la cartella viene creata fisicamente nella posizione prevista. soluzioni e cartelle.


1
Ciò è utile ma in "visualizzazione origine" hai perso tutti i collegamenti di clic con il pulsante destro del mouse su un progetto, ovvero "Gestisci pacchetti NuGet".
David Liang

1
Perché solo le soluzioni oi progetti C ++ si comportano in modo diverso rispetto ad altri linguaggi?
Friendly Ghost

1
Questo mi ha aiutato, quindi ho creato una cartella nella vista cartelle dove volevo, quindi ho aggiunto una cartella della soluzione e ho aggiunto il progetto come figlio della cartella. Non ha davvero senso per me, ma questa risposta mi ha aiutato a ottenere
hanzolo

Questo è esattamente quello che voglio. Grazie!
user1633272

10

La risposta scelta suggerisce che sarebbe possibile utilizzare progetti reali invece di cartelle di soluzioni, ma non spiega realmente come. Immagino che quello che sto descrivendo qui sia forse il modo meno imbarazzante per ottenerlo ... :-P

Il problema con i file di progetto regolari è che alla fine verranno compilati da MSBUILD. E se vuoi avere un progetto che contiene solo file non compilabili, sarà un problema.

Ma qualche tempo fa Visual Studio ha introdotto un nuovo tipo di progetto: Shared Project (estensione .shproj). Questo tipo di progetto non viene compilato per impostazione predefinita, ma solo quando (e solo se) fa riferimento a un altro progetto.

Quindi una parte del trucco qui è usare progetti condivisi invece di cartelle di soluzioni . È ovviamente possibile aggiungere un progetto condiviso a cui non fa mai riferimento nessun altro progetto, il che significa che possiamo evitare il problema presentato sopra.

Quindi, utilizzando la <None Include="**/*" />clausola nel file .shproj, possiamo fare in modo che rifletta automaticamente tutti i nuovi file e / o sottocartelle.

Quindi fondamentalmente fai questo:

  • Crea una nuova cartella nella tua soluzione.
  • Aggiungi un nuovo file .shproj alla radice di questa nuova cartella.
  • Fai riferimento al nuovo .shproj nella tua soluzione.

Ad esempio, nel mio caso, ho creato un DockerDev.shproj, quindi posso raggruppare alcuni script relativi a docker che eseguiamo solo nelle nostre macchine di sviluppo:

<?xml version="1.0" encoding="utf-8"?>
<!-- DockerDev/DockerDev.shproj -->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <None Include="**/*" />
  </ItemGroup>
</Project>

Questo file .shproj terrà traccia di qualsiasi file, in qualsiasi sottocartella di questa nuova DockerDevcartella nella mia soluzione.

Per quanto ho potuto vedere, questa soluzione funziona più o meno come ciò che l'OP ha richiesto: funzionerà come riferimento non compilabile a una cartella e rifletterà automaticamente tutte le modifiche apportate ad essa.


Nella mia esperienza, questo accumula cruft non appena un ignaro membro del team tocca una qualsiasi proprietà del file; dopodiché vengono visualizzati file duplicati nel riquadro di navigazione. In alcune condizioni ogni file finisce per essere enumerato nel file .proj e quindi ne consegue la bruttezza. Anche se non mi piace arrendermi, continuo a preferire l'approccio "Aggiungi sito Web esistente".
Shannon,

@shannon Non ho mai sperimentato il comportamento che stai menzionando, ma "l'assenza di prove non è una prova di assenza", quindi c'è quello. Ma uso quotidianamente progetti condivisi, quindi penso che anche questo conti. Per quanto riguarda i progetti di siti Web (WSP), potrebbero anche funzionare, immagino, è passato molto tempo che non li uso.
rsenna

8

Sara Ford ha contribuito con una macro per aggiungere fare questo. In Visual Studio 2010, se apri Esplora macro, vedrai una macro chiamata "GenerateSlnFolderOnDirStructure". Ciò automatizzerà la creazione delle cartelle della soluzione e aggiungerà i file.


6

Folder To Solution Folder Di Cecilia Wirén - CeciliaSHARP

Elimina il fastidio di aggiungere diversi file alla cartella della soluzione. Basta usare il menu di scelta rapida per la soluzione e appena sotto l'opzione di creare una nuova cartella della soluzione ora trovi "Aggiungi cartella come cartella della soluzione". Questo creerà una cartella della soluzione con lo stesso nome che hai selezionato e aggiungerà gli elementi all'interno di quella cartella alla cartella della soluzione. Ciò non sposterà i file sul disco.


3

No, non è supportato. Come sospettavi, le cartelle della soluzione sono semplicemente voci secondarie virtuali nel file .sln, niente a che fare con il file system.


3

Visual Studio non ha supporto per questo. Tuttavia, ho creato un'estensione che fa qualcosa di simile per VS2013. Mappa le cartelle delle soluzioni in cartelle fisiche sul disco rigido, sebbene la mappatura sia unidirezionale (dal disco rigido alla soluzione). Ciò significa che il contenuto di una cartella della soluzione rifletterà il contenuto della cartella del disco rigido e non viceversa.

Detto questo, l'estensione potrebbe ancora essere utile. Supporta la mappatura delle cartelle della soluzione in cartelle fisiche, il filtraggio di file e directory in base all'espressione regolare e la memorizzazione delle mappature nel file .sln. Le proprietà non sono invadenti, quindi gli sviluppatori senza l'estensione possono comunque aprire sln e non essere interessati.

Ospitato nella galleria di Visual Studio: https://visualstudiogallery.msdn.microsoft.com/69e19ea6-4442-4cb6-b300-044dd21f02bd

Modifica: caricato su bitbucket. Ora open source. Licenza MIT. https://bitbucket.org/LSS_NorthWind/physical-solution-folders


3

Nota: Sì, è possibile creare una cartella su root ma è un po 'complicato ....

Dando qualche sforzo in più puoi farlo Come? Seguiamo il passaggio:

  • 1-Crea cartella es: " nuova cartella " su root (dove risiede il tuo file .sln).
  • 2.Copia e incolla i tuoi progetti all'interno della cartella.
  • 3. vai al tuo file sln e trova i progetti spostati e aggiungi nuova cartella \ nell'indirizzo del progetto spostato.
  • 4.Salva il file sln.
  • 5.Apri il tuo progetto e esegui il commit del repository in git o giù di lì ...
  • 6.Prendi il repository in una nuova posizione.

    Hai fatto...

se ancora non riesci a vedere la tua cartella -----

  • 1.Aggiungere una cartella della soluzione xyz.
  • 2.Aprire il file sln e modificare il nome della cartella con il nome della cartella.

Congratulazioni, hai finito ..

Se devi affrontare qualsiasi problema, scrivimi per chiedere aiuto ..


3

Crea "Cartella della soluzione". Questo creerà una cartella logica, ma non fisica. Fare clic con il tasto destro sulla cartella della soluzione e aprire una nuova finestra di dialogo del progetto. Ma prima di fare clic su OK, è necessario modificare la posizione di un progetto nella cartella fisica desiderata e VS la creerà e inserirà il progetto all'interno.


1

È possibile aggiungere cartelle reali scegliendo "Aggiungi nuovo filtro" per un file di progetto di Visual Studio. Puoi anche fare "Aggiungi nuovo filtro" in una cartella esistente. Una volta creata la cartella, rinominala e aggiungi il file sorgente o di intestazione o quello che si adatta al tuo progetto. Questo è un modo che conosco che ci consente di creare cartelle reali tramite l'IDE di Visual Studio.


Questa funzionalità è specifica per i progetti C ++.
Tamir Daniely

Questa soluzione si applica anche ai progetti VS: la domanda riguarda le cartelle a livello di soluzione.
Theo

0

La cartella creata sotto la soluzione sarà virtuale come detto. Forse questo potrebbe essere chiamato una soluzione alternativa, ma puoi creare fisicamente la cartella su disco prima o quando aggiungi un nuovo elemento / progetto e Robert dovrebbe essere un fratello di tuo padre.

ps- a uno sguardo più attento forse dovrei spiegare "Bob è tuo zio" significa che stai bene / a posto.


Ha importanza se Robert è il fratello di tua madre?
Darrel Lee

0

Ho voluto questa funzione alcune volte io stesso, ma alla fine della giornata, NON vuoi davvero la possibilità di farlo. Pensa alla tua soluzione (file) come alla radice di un'applicazione web e pensa alle cartelle della soluzione come directory virtuali (letteralmente e funzionalmente). Il contenuto di una directory virtuale web potrebbe trovarsi fisicamente su un server completamente diverso. Dove Visual Studio ha confuso il concetto di cartelle della soluzione è consentendo di creare nuovi file all'interno della cartella. Dovresti sempre "Aggiungi esistente" quando aggiungi contenuti. Quando aggiungi esistenti, crea un collegamento al percorso di origine del file.

Ma il motivo per cui non si desidera che le cartelle delle soluzioni si comportino come cartelle "fisiche" è perché il layout della soluzione potrebbe non utilizzare necessariamente la stessa convenzione del layout del controllo del codice sorgente. Le cartelle delle soluzioni ti consentono di personalizzare la gerarchia dei tuoi progetti in modo da poter raggruppare progetti ed elementi insieme come preferisci, quindi decidere che non ti piace e cambiarlo di nuovo senza dover passare attraverso l'incubo di spostare gli elementi di controllo del codice sorgente intorno e irritando il resto della tua squadra.


1
Questa è la risposta giusta: crea il file su disco in una cartella con lo stesso nome della cartella virtuale, quindi aggiungi il file in VS usando "Aggiungi esistente".
Richard

4
Avrebbero potuto facilmente implementare cartelle sia virtuali che fisiche. È chiaramente un trascurare. Vedi riferimento: ogni altro IDE, mai.
Tamir Daniely

6
Non capisco affatto perché il concetto di directory virtuali (IIS) abbia qualcosa a che fare con le cartelle delle soluzioni. Per quanto riguarda l'argomento del controllo del codice sorgente, non vedo il problema. Perché le mosse dei file irritano il resto della tua squadra? È un'operazione comune. E perché vorresti che il layout dei file nel controllo del codice sorgente fosse diverso dal layout fisico?
user247702

2
Cartelle soluzione fisiche avrebbero rendere più facile (anche se solo un po ') per creare moderne strutture di cartelle come NancyFx di , dove più progetti rientrano in categorie come src, test, tools, ecc Faresti sicuramente desidera prendere quella decisione, in via preliminare progetto per il vostro punto circa irritando il team, ma questo è vero per quasi tutte le decisioni architettoniche.
Eric Eskildsen

3
-1 Il mio caso d'uso è questo: a volte vogliamo solo aggiungere determinati documenti alla soluzione. Non verranno compilati, ma vengono mantenuti nel controllo del codice sorgente. Di solito abbiamo una cartella speciale per loro. Vorrei avere quella cartella nella mia soluzione, non i file che contiene, ma la cartella stessa. Sì, ci sono modi per aggirare questa limitazione, ma non sono ottimali. Avere un riferimento effettivo a una cartella nella soluzione funzionerebbe semplicemente.
rsenna

0

Ho una piccola soluzione per questo (non è eccezionale, ma funziona).

  1. Crea una cartella nella tua soluzione (ad esempio "Contoso")
  2. Fare clic con il tasto destro sulla soluzione, quindi fare clic su "Apri cartella in Esplora soluzioni"
  3. Creare la cartella fisica (ad esempio "Contoso") nella directory della soluzione
  4. Copia / Crea file nella cartella fisica.
  5. Trascina i file nella cartella virtuale in Esplora soluzioni.

Non è eccezionale perché dovrai mantenere manualmente i riferimenti ai file, ma per me funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.