Gibt es eine Möglichkeit zum automatischen Content-Dateien in asp.net Projektdatei enthält?

StackOverflow https://stackoverflow.com/questions/2551107

  •  23-09-2019
  •  | 
  •  

Frage

Ich füge häufig eine Menge von Inhaltsdateien (meist Bilder und js) zu meinem ASP.NET-Projekt. Ich verwende VS-System veröffentlichen und zu veröffentlichen, neue Dateien werden nicht veröffentlicht, bis ich sie in dem Projekt enthalten. Ich möchte automatisch alle Dateien im angegebenen Verzeichnis enthält. Gibt es eine Möglichkeit, um festzulegen, welche Verzeichnisse sollten in csproj Datei oder anderswo?

enthalten Auto-sein
War es hilfreich?

Lösung

Alt Faden, ich weiß, aber ich habe einen Weg gefunden, dies zu tun, dass ich es einfach nicht schaffen, und auf meiner Suche es ein letztes Mal zu finden, stieß ich auf diese Frage. Der beste Weg, die ich gefunden habe, um dies ist das Ziel in der Before CSPROJ Datei zu verwenden.

<Target Name="BeforeBuild">
    <ItemGroup>
        <Content Include="**\*.less" />
    </ItemGroup>
</Target>

VS 2010 wird diesen Abschnitt nicht berühren, und es wird sichergestellt, dass Ihre Dateien als Inhalt jedes Mal enthalten sind, das Projekt erstellt wird.

Andere Tipps

Sie können einfach Ihre Website CSPROJ Datei erweitern. Fügen Sie einfach Ihre Inhalte Stammordner mit einem rekursiven Platzhalter:

...
<ItemGroup>
    <!-- your normal project content -->
    <Content Include="Default.aspx" />

    <!-- your static content you like to publish -->
    <Content Include="Images\**\*.*" />
</ItemGroup>
...

Ihr macht so diesen Ordner und alle Inhalte unten sichtbar in Ihrer Lösung Browser.

Wenn Sie versuchen, den Ordner innerhalb der Lösung Browser zu verbergen, indem die Angabe

<Content Include="Images\**.*.*">
    <Visible>false</Visible>
</Content>

es wird nicht veröffentlicht.


Aktualisieren

Wie Sie bereits entdeckten die Wildcard wird, sobald Sie den Ordner in Ihrer Lösung berühren ersetzt werden, da VS Projekte nicht willkürlich Inhalt enthalten sollen.

So werden Sie müssen sicherstellen, dass der Ordner und sein Inhalt niemals aus VS geändert -. Hinzufügen oder Entfernen von Dateien können nur auf dem Dateisystem durchgeführt werden ... das ist, was Sie wollten, wie ich Ihre Frage verstanden

Es wäre einfacher, wenn der Ordner in VS versteckt sein könnte, aber ich kann nicht einen Weg zu verstecken und veröffentlichen finden.

Ein weiterer erfolgloser Ansatz war es, den Ordner von einer CreateItem Aufgabe aufzunehmen. Dies führte in den Inhalt der Ordner veröffentlicht wird zu \ bin \ app.publish \ ... und nicht überzeugt werden konnte, sie veröffentlichen zusammen mit den Inhaltselementen im Inneren des CSPROJ so dass ich nicht anwesend es tat in meiner Antwort.

Für diejenigen, die Probleme mit Chris' Antwort , das ist die Lösung für Visual Studio 2012 und neuen:

<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
  <ItemGroup>
    <Content Include="images\**" />
  </ItemGroup>
</Target>

erwähnt als Chris in seiner Antwort -. Visual Studio nicht diesen <Target> Abschnitt berühren, auch wenn Sie manuell Geige um (Hinzufügen / Entfernen von Dateien) mit dem Zielverzeichnis

Bitte beachten Sie, dass Sie sollte sind ein Unterverzeichnis, wo sich die Dateien befinden (im Fall oben, es ist images). Visual Studio / MSBuild wird diese Dateien im selben Verzeichnis innerhalb der Projektstruktur platzieren. Wenn Sie nicht über ein Unterverzeichnis verwenden, werden die Dateien im Stammverzeichnis der Projektstruktur platziert werden.

Für eine schnelle Erklärung der Platzhalter:

  • ** Mittel alles rekursiv (Dateien, Unterverzeichnisse und Dateien innerhalb dieser)
  • *.ext enthält alle Dateien mit der Erweiterung ext innerhalb der Top-Level-Verzeichnis, aber nicht Unterverzeichnisse
    • Zum Beispiel *.ext *.png sein könnte, *.js usw. Alle Dateierweiterung funktioniert
  • **\*.ext enthält alle Dateien mit der Erweiterung ext aus dem Top-Level-Verzeichnis und alle Unterverzeichnissen.
  • Sehen Sie die Antwort von Wie verwende ich Nant / Ant Namensmuster? für eine vollständigere Erklärung mit Beispielen.

Für die Komplettierung, beachten Sie bitte, dass es einen Unterschied gibt zwischen <Target> verwenden und nicht verwenden.

Mit dem <Target> Ansatz, Visual Studio nicht zeigt die Dateien im Projektmappe-Explorer.

<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
  <ItemGroup>
    <Content Include="images\**" />
  </ItemGroup>
</Target>

Die nicht-<Target> Ansatz anweisen Visual Studio auf zeigen die Dateien im Projektmappen-Explorer. Der Nachteil dieser ist, dass jede Manipulation des automatischen Verzeichnisse Visual Studios verursachen den Wildcard-Eintrag außer Kraft zu setzen. Es sollte auch beachtet werden, dass der Ansatz unter Willen nur die Lösung Explorer aktualisieren auf die Lösung / Projekt in VS. Öffnung Selbst die „Refresh“ Symbolleiste auf die Schaltfläche Solution Explorer wird es nicht tun.

<ItemGroup>
  <Content Include="images\**" />
</ItemGroup>

können Sie die System.IO.Directory.GetFile(string) Methode des Frameworks verwenden und seine Überlastungen rekursiv alle Dateien enthalten.

  <ItemGroup>
    <Content Include="$([System.IO.Directory]::GetFiles('$(ProjectDir)Scripts\', '*.js', SearchOption.AllDirectories))" />
    <Content Include="$([System.IO.Directory]::GetFiles('$(ProjectDir)Images\', '*.png', SearchOption.AllDirectories))" />
  </ItemGroup>

Ich habe oben geschrieben, wie ich war in der Lage, den Inhalt zu bekommen umfasst mit einer kleinen Powershell-Skript erstellt:

$folders = Get-ChildItem .\ -r -Directory
$filtered = $folders |Select-Object @{Name='FullName';Expression={$_.fullname.replace($pwd,'')}}, @{Name='FolderDepth';Expression={($_.fullname.Split('\').Count) - ($Pwd.Path.split('\').count)}} | Sort-Object -Descending FullName,folderDepth 
$basefolders = $filtered | Where-Object{$_.folderdepth -eq 1}
$basefoldersobj = @()
foreach($basefolder in $basefolders)
{
  $basefoldername =$baseFolder.fullname
  $filteredbase = $filtered -match "\$basefoldername\\" | Sort-Object -Descending FolderDepth | Select-Object -first 1
  if($filteredbase -eq $null)
  {
    $filteredbase = $filtered -match "\$basefoldername" | Sort-Object -Descending FolderDepth | Select-Object -first 1
  }
  $obj = New-Object psobject
  Add-Member -InputObject $obj -MemberType NoteProperty -Name 'Folder' -Value $basefolder.fullname.trim('\')
  Add-member -InputObject $obj -MemberType NoteProperty -Name 'DeepestPath' -Value $filteredbase.folderDepth
  $basefoldersobj += $obj
}
$include = '*.*'
foreach($bfolderObj in $basefoldersobj)
{
  $includecount = ''
  $includecount = "\$include" * ($bfolderObj.Deepestpath)
  Write-Output "<content Include=`"$($bfolderObj.folder)$includecount`" /> "
}

sollten Diese erzeugen die notwendige Anweisung an der Powershell-Eingabeaufforderung

schließen

Sie können Dateien mit Links wie folgt hinzufügen, sie sind durchsuchbar, Blick-Lage, aber sie tun nicht Kasse, wenn Sie versuchen, sie zu ändern, auch Visual Studio verlässt die Platzhalter anstelle:

  <ItemGroup>
    <Content Include="..\Database Schema\Views\*.sql">
      <Link>Views\*.sql</Link>
    </Content>
  </ItemGroup>

Das geht in der .proj Datei.

Mein Wissen nicht; jedoch ist mein Vorschlag, sie in das Projekt eingefügt werden, da dies sie standardmäßig enthalten. Also, anstatt sie in das Verzeichnis über den Explorer einfügen, verwenden Sie Visual Studio, um die Dateien in den Ordner einfügen.

wurde mir klar, dass die beste Lösung für diese Dateien manuell hinzuzufügen ist, eins nach dem anderen. Wenn Sie Hunderte von ihnen haben, wie ich tat, war es nur eine Frage von wenigen Stunden. Lustig, dass auch im Jahr 2016 mit VS 2015 dieses schwerwiegende Problem ist noch nicht gelöst. Ahh, wie liebe ich Xcode.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top