webentwicklung-frage-antwort-db.com.de

Gibt es eine Möglichkeit, Inhaltsdateien automatisch in die asp.net-Projektdatei aufzunehmen?

Ich füge meinem ASP.NET-Projekt häufig viele Inhaltsdateien (hauptsächlich Bilder und js) hinzu. Ich verwende das VS-Veröffentlichungssystem, und beim Veröffentlichen werden neue Dateien erst veröffentlicht, wenn ich sie in das Projekt aufgenommen habe. Ich möchte automatisch alle Dateien in das angegebene Verzeichnis aufnehmen. Gibt es eine Möglichkeit, anzugeben, welche Verzeichnisse automatisch in die csproj-Datei oder anderswo aufgenommen werden sollen?

78
Marko

Alter Thread, ich weiß, aber ich habe einen Weg gefunden, den ich immer wieder vergesse, und auf meiner Suche, ihn ein letztes Mal zu finden, bin ich auf diese Frage gestoßen. Die beste Möglichkeit, die ich gefunden habe, besteht darin, das BeforeBuild-Ziel in der .csproj-Datei zu verwenden.

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

VS 2010 wird diesen Abschnitt nicht berühren und stellt sicher, dass Ihre Dateien bei jeder Projekterstellung als Inhalt enthalten sind.

128
Chris

Sie können Ihre Website einfach um eine .csproj-Datei erweitern. Fügen Sie einfach Ihren Inhaltsstammordner mit einem rekursiven Platzhalter hinzu:

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

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

Dadurch werden dieser Ordner und der gesamte Inhalt in Ihrem Lösungsbrowser angezeigt.

Wenn Sie versuchen, den Ordner im Lösungsbrowser durch Angabe von auszublenden

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

es wird nicht veröffentlicht.


pdate

Wie Sie bereits festgestellt haben, wird der Platzhalter ersetzt, sobald Sie den Ordner in Ihrer Lösung berühren, da VS-Projekte nicht so konzipiert sind, dass sie beliebigen Inhalt enthalten.

Sie müssen also sicherstellen, dass der Ordner und sein Inhalt niemals innerhalb von VS geändert werden. Das Hinzufügen oder Entfernen von Dateien kann nur auf dem Dateisystem erfolgen. Genau das ist es, was Sie wollten, da ich Ihre Frage verstanden habe.

Es wäre einfacher, wenn der Ordner in VS ausgeblendet werden könnte, aber ich konnte keine Möglichkeit finden, ihn auszublenden UND zu veröffentlichen.

Ein anderer erfolgloser Ansatz bestand darin, den Ordner durch eine CreateItem -Aufgabe einzuschließen. Dies führte dazu, dass der Inhalt des Ordners in \bin\app.publish\... veröffentlicht wurde, und konnte nicht davon überzeugt werden, ihn zusammen mit dem Inhalt zu veröffentlichen Elemente in der .csproj-Datei, daher habe ich sie in meiner Antwort nicht angegeben.

49
Filburt

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

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

Wie Chris in seiner Antwort erwähnt hat - Visual Studio wird nicht berühren Sie diesen Abschnitt <Target>, auch wenn Sie manuell mit dem Zielverzeichnis herumspielen (Dateien hinzufügen/entfernen).

Bitte beachten Sie, dass Sie sollte ein Unterverzeichnis angeben, in dem sich die Dateien befinden (im obigen Fall ist es images). Visual Studio/MSBuild platziert diese Dateien im selben Verzeichnis innerhalb der Projektstruktur. Wenn Sie kein Unterverzeichnis verwenden, werden die Dateien im Stammverzeichnis der Projektstruktur abgelegt.

Zur schnellen Erklärung der Platzhalter:

  • ** bedeutet alles rekursiv (Dateien, Unterverzeichnisse und Dateien in diesen)
  • *.ext schließt alle Dateien mit der Erweiterung ext im obersten Verzeichnis ein, jedoch keine Unterverzeichnisse
    • Beispielsweise könnte *.ext*.png, *.js usw. sein. Alle Dateierweiterung funktioniert
  • **\*.ext enthält alle Dateien mit der Erweiterung ext aus dem obersten Verzeichnis und allen Unterverzeichnissen.
  • In der Antwort von Wie verwende ich Nant/Ant-Namensmuster? finden Sie eine ausführlichere Erläuterung mit Beispielen.

Beachten Sie zum Abschluss, dass es einen Unterschied gibt, ob Sie <Target> verwenden oder nicht.

Bei der Methode <Target> zeigt Visual Studio nicht ​​die Dateien im Projektmappen-Explorer an.

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

Der non<Target>-Ansatz wird Visual Studio anweisen, show die Dateien im Projektmappen-Explorer anzuzeigen. Der Nachteil bei diesem ist, dass jede Manipulation der Verzeichnisse automatic dazu führt, dass Visual Studio den Platzhaltereintrag überschreibt. Es sollte auch beachtet werden, dass der Ansatz unten only den Projektmappen-Explorer beim Öffnen der Projektmappe/des Projekts in VS aktualisiert. Selbst die Schaltfläche "Aktualisieren" in der Symbolleiste des Projektmappen-Explorers wird dies nicht tun.

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

Sie können die System.IO.Directory.GetFile(string) -Methode des Frameworks und dessen Überladungen verwenden, um alle Dateien rekursiv einzuschließen.

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

Ich habe aufgeschrieben, wie ich die Inhalts-Includes mit einem kleinen Powershell-Skript erstellen konnte:

$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`" /> "
}

Dies sollte die notwendige include-Anweisung an der Powershell-Eingabeaufforderung erzeugen

3
thom schumacher

Sie können Dateien mit solchen Links hinzufügen. Sie sind durchsuchbar und können angezeigt werden. Sie werden jedoch nicht ausgecheckt, wenn Sie versuchen, sie zu ändern. Außerdem belässt Visual Studio die Platzhalter:

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

Dies geht in die .proj-Datei.

2
chongo2002

Meines Wissens nicht; Mein Vorschlag ist jedoch, sie in das Projekt einzufügen, da dies sie standardmäßig einschließt. Verwenden Sie Visual Studio, um die Dateien in den Ordnern einzufügen, anstatt sie über den Explorer in das Verzeichnis einzufügen.

1
kamranicus