web-dev-qa-db-ja.com

コンテンツファイルをasp.netプロジェクトファイルに自動的に含める方法はありますか?

多くのコンテンツファイル(主に画像とjs)をASP.NETプロジェクトに頻繁に追加しています。私はVS発行システムを使用していますが、発行時には、プロジェクトに含めるまで新しいファイルは発行されません。指定したディレクトリ内のすべてのファイルを自動的に含めたいです。 csprojファイルまたはその他の場所に自動的に含めるディレクトリを指定する方法はありますか?

78
Marko

古いスレッド、私は知っていますが、これを行う方法を見つけましたが、忘れてしまいます。最後にそれを見つけるための検索で、私はこの質問につまずきました。これを見つけた最善の方法は、.csprojファイルでBeforeBuildターゲットを使用することです。

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

VS 2010はこのセクションには触れず、プロジェクトがビルドされるたびにファイルがコンテンツとして含まれるようにします。

128
Chris

Webサイトの.csprojファイルを拡張するだけです。再帰的なワイルドカードを使用してコンテンツルートフォルダーを追加するだけです。

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

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

そうすると、このフォルダーと以下のすべてのコンテンツがソリューションブラウザー内に表示されます。

指定してソリューションブラウザー内のフォルダーを非表示にしようとした場合

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

公開されません。


更新

VSプロジェクトは任意のコンテンツを含むように設計されていないため、既に発見したように、ソリューション内のフォルダーに触れるとすぐにワイルドカードが置き換えられます。

したがって、フォルダとその内容がVS内から変更されないようにする必要があります-ファイルの追加または削除はファイルシステムでのみ行うことができます...これはあなたの質問を理解したのであなたが望んでいたことです。

VSでフォルダを非表示にできれば簡単ですが、非表示にして公開する方法が見つかりませんでした。

別の失敗したアプローチは、CreateItemタスクによってフォルダーを含めることでした。これにより、フォルダーのコンテンツが\ bin\app.publish\...に公開され、コンテンツと一緒に公開することを確信できませんでした.csproj内の項目なので、回答には表示しませんでした。

49
Filburt

Chris 'answer の使用に問題がある場合、これはVisual Studio 2012以降のソリューションです。

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

Chrisが答えで述べたように、Visual Studioは、ターゲットディレクトリを手動で操作(ファイルの追加/削除)した場合でも、この<Target>セクションに触れません

shouldには、ファイルが置かれているサブディレクトリを含めることに注意してください(上記の場合、imagesです)。 Visual Studio/MSBuildは、これらのファイルをプロジェクト構造内の同じディレクトリに配置します。サブディレクトリを使用しない場合、ファイルはプロジェクト構造のルートに配置されます。

ワイルドカードの簡単な説明:

  • **everythingを再帰的に意味します(ファイル、サブディレクトリ、およびそれらの中のファイル)
  • *.extには、最上位ディレクトリ内の拡張子extを持つすべてのファイルが含まれますが、サブディレクトリには含まれません
    • たとえば、*.ext*.png*.jsなどになります任意のファイル拡張子が機能します
  • **\*.extには、最上位ディレクトリおよびすべてのサブディレクトリからの拡張子がextのすべてのファイルが含まれます。
  • 例でのより完全な説明については、 Nant/Ant命名パターンの使用方法 の回答を参照してください。

完了のために、<Target>を使用する場合と使用しない場合に違いがあることに注意してください。

<Target>アプローチでは、Visual Studio しないソリューションエクスプローラー内にファイルを表示します。

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

Non -<Target>アプローチwillソリューションエクスプローラー内のファイルをshowに指示します。この方法の欠点は、automaticディレクトリを操作すると、Visual Studioがワイルドカードエントリをオーバーライドすることです。また、以下の方法では、VSでソリューション/プロジェクトを開くと、ソリューションエクスプローラーがonlyで更新されることに注意してください。ソリューションエクスプローラーの[更新]ツールバーボタンでも実行されません。

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

フレームワークのSystem.IO.Directory.GetFile(string)メソッドとそのオーバーロードを使用して、すべてのファイルを再帰的に含めることができます。

  <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

小さなPowerShellスクリプトで作成されたコンテンツインクルードを取得する方法を書きました。

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

これにより、powershellプロンプトで必要なincludeステートメントが生成されます。

3
thom schumacher

次のようなリンクを持つファイルを追加できます。それらは検索可能で表示可能ですが、変更しようとしてもチェックアウトされません。また、Visual Studioはワイルドカードをそのまま残します。

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

これは.projファイルの内部に入ります。

2
chongo2002

私の知る限りではありません。しかし、私の提案はそれらをプロジェクトに貼り付けることです。これにはデフォルトで含まれるからです。そのため、エクスプローラーでディレクトリに貼り付ける代わりに、Visual Studioを使用してファイルをフォルダーに貼り付けます。

1
kamranicus