Подтвердить что ты не робот

Есть ли способ автоматически включать файлы содержимого в файл проекта asp.net?

Я часто добавляю много файлов контента (в основном изображений и js) в мой проект ASP.NET. Я использую систему публикации VS, а при публикации новые файлы не публикуются до тех пор, пока я не включу их в проект. Я хотел бы включить все файлы в указанный каталог. Есть ли способ указать, какие каталоги должны быть автоматически включены в файл csproj или где-нибудь еще?

4b9b3361

Ответ 1

Старая нить, я знаю, но я нашел способ сделать это, что я забыл, и, пытаясь найти его в последний раз, я наткнулся на этот вопрос. Лучший способ, которым я нашел это, - использовать цель BeforeBuild в файле .csproj.

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

VS 2010 не коснется этого раздела и гарантирует, что ваши файлы будут включены в качестве контента каждый раз, когда проект будет построен.

Ответ 2

Вы просто можете расширить свой сайт .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 Task. Это привело к тому, что содержимое папки было опубликовано в \bin\app.publish \... и не могло быть убеждено опубликовать ее вместе с элементами контента внутри .csproj, поэтому я не представил ее в своем ответе.

Ответ 3

Для тех, у кого проблемы с использованием ответа Криса, это решение для Visual Studio 2012 и новее:

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

Как отметил Крис в своем ответе, Visual Studio не будет касаться этого раздела <Target>, даже если вы вручную переключаетесь (добавляете/удаляете файлы) с целевым каталогом.

Обратите внимание, что вы должны включить подкаталог, в котором находятся файлы (в приведенном выше случае это images). Visual Studio/MSBuild поместит эти файлы в один и тот же каталог в структуре проекта. Если вы не используете подкаталог, файлы будут помещены в корень структуры проекта.

Для быстрого объяснения подстановочных знаков:

  • ** означает все рекурсивно (файлы, подкаталоги и файлы внутри них)
  • *.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 будет инструктировать Visual Studio показывать файлы в обозревателе решений. Недостаток этого заключается в том, что любые манипуляции с автоматическими каталогами приводят к тому, что Visual Studio переопределяет шаблонную запись. Также следует отметить, что приведенный ниже подход обновит обозреватель решений только после открытия решения/проекта в VS. Даже кнопка "Обновить" на панели инструментов обозревателя решений не сделает этого.

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

Ответ 4

Вы можете использовать метод framework 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>

Ответ 5

Я написал, как мне удалось включить контент, созданный с помощью небольшой powershell script:

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

Это должно привести к обязательному заявлению include в приглашении powershell

Ответ 6

Вы можете добавлять файлы со ссылками вроде этого, они доступны для поиска, доступны для просмотра, но они не проверяются, если вы пытаетесь изменить их, а также визуальная студия оставляет подстановочные знаки:

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

Это входит в файл .proj.

Ответ 7

Насколько мне известно; однако мое предложение состоит в том, чтобы вставить их в проект, поскольку по умолчанию они будут включены в них. Итак, вместо вставки их в каталог через Explorer, используйте Visual Studio для вставки файлов в папки.

Ответ 8

Я понял, что лучшее решение для этого - это вручную добавлять файлы по одному. Если у вас их сотни, как я, это было всего лишь несколько часов. Забавно, что даже в 2016 году с VS 2015 эта серьезная проблема до сих пор не решена. Ах, как я люблю Xcode.