sourcecode

콘텐츠 파일을 asp.net 프로젝트 파일에 자동으로 포함할 수 있는 방법이 있습니까?

codebag 2023. 4. 23. 10:18
반응형

콘텐츠 파일을 asp.net 프로젝트 파일에 자동으로 포함할 수 있는 방법이 있습니까?

ASP에 많은 콘텐츠 파일(대부분 이미지와 js)을 추가하고 있습니다.NET 프로젝트VS 퍼블리시 시스템을 사용하고 있는데 퍼블리시 시 프로젝트에 포함할 때까지 새로운 파일이 퍼블리시되지 않습니다.지정된 디렉토리에 모든 파일을 자동으로 포함시키고 싶습니다.csproj 파일 또는 다른 장소에 어떤 디렉토리를 자동으로 포함시킬지 지정할 수 있는 방법이 있습니까?

오래된 실타래인 건 알지만, 계속 잊어버리는 방법을 찾아냈고, 마지막으로 한 번 더 찾다가 우연히 이 질문을 발견했습니다.이를 위한 최선의 방법은 .csproj 파일에서 BeforeBuild 타깃을 사용하는 것입니다.

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

VS 2010에서는 이 섹션은 다루지 않습니다.프로젝트가 구축될 때마다 파일이 컨텐츠로 포함됩니다.

웹 사이트 .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\...에 게시되었습니다..joj의 콘텐츠 항목과 함께 공개하는 것이 납득되지 않아 답변에 제시하지 않았습니다.

Chris의 답변을 사용하는 데 문제가 있는 사용자를 위해 Visual Studio 2012 이상에 대한 솔루션은 다음과 같습니다.

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

Chris가 답변에서 언급한 바와 같이 Visual Studio는 를 건드리지 않습니다.<Target>대상 디렉토리를 수동으로 조작하는 경우라도(스위치/스위치 파일) 섹션은 사용할 수 있습니다.

파일이 있는 서브디렉토리를 포함할 필요가 있습니다(위의 경우,imagesStudio/ 구조 내의 합니다.) Visual Studio/MS빌드하위 디렉토리를 사용하지 않을 경우 파일은 프로젝트 구조의 루트에 배치됩니다.

와일드카드에 대한 간단한 설명은 다음과 같습니다.

  • **는 재귀적으로 모든 것을 의미합니다(파일, 서브 디렉토리 및 이들 내의 파일).
  • *.ext에는 확장자가 "Manager"인 됩니다.ext최상위 디렉토리 내에 있지만 하위 디렉토리에는 없습니다.
    • 를 들어, 「」라고 하는 것은,*.ext"" " " " " " " " " " 가 될 수 .*.png,*.js파일 확장자는 모두 사용할 수 있습니다.
  • **\*.ext에는 확장자가 "Manager"인 됩니다.ext최상위 디렉토리 및 모든 하위 디렉토리에서 이동합니다.
  • Nant/Ant 명명 패턴 사용 방법에서 답변을 참조하십시오.예를 들어 보다 자세한 설명을 참조해 주세요.

하기 위해서, 료, 용, 용, 사, 사, 사, for, for, , 사, for, for, for, for, for, for, for, for, for, for, for, for, for, for, for, for, for, for, for <Target>안 쓰니까.

<Target>접근법, Visual Studio는 솔루션 탐색기에 파일을 표시하지 않습니다.

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

<Target>어프로치는 솔루션 탐색기 내의 파일을 표시하도록 Visual Studio에 지시합니다.이 방법의 단점은 자동 디렉토리를 조작하면 Visual Studio가 와일드카드 엔트리를 덮어쓰게 된다는 것입니다.또한 다음 접근방식은 VS에서 솔루션/프로젝트를 열었을 때만 Solution Explorer를 업데이트합니다.Solution Explorer의 "새로 고침" 툴바 버튼도 사용할 수 없습니다.

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

「 」를 할 수 .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>

다음과 같은 링크를 사용하여 파일을 추가할 수 있습니다. 이러한 파일은 검색 및 보기가 가능하지만 변경하려고 해도 체크 아웃되지 않습니다.또한 비주얼 스튜디오는 와일드카드를 그대로 유지합니다.

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

이것은 .proj 파일 안에 들어갑니다.

작은 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 문이 생성됩니다.

제가 알기로는 아닙니다만, 기본적으로 포함되므로 프로젝트에 붙여넣기를 권장합니다.따라서 탐색기를 통해 디렉터리에 파일을 붙여넣는 대신 Visual Studio를 사용하여 파일을 폴더에 붙여넣습니다.

다음과 같이 파일이 있는 폴더를 재귀적으로 추가할 수 있습니다.

  <ItemGroup>
    <Content Include="somefolder\*.txt">
        <Link>%(RecursiveDir)myown_somefolder\%(Filename)%(Extension)</Link>
    </Content>
  </ItemGroup>

이를 위한 최선의 해결책은 수동으로 파일을 하나씩 추가하는 것임을 깨달았습니다.만약 당신이 나처럼 수백 개를 가지고 있다면 그것은 단지 몇 시간 문제였다.2016년 VS 2015에서도 이 심각한 문제가 해결되지 않은 것은 이상하다.아, 내가 X코드를 얼마나 좋아하는지.

언급URL : https://stackoverflow.com/questions/2551107/is-there-a-way-to-automatically-include-content-files-into-asp-net-project-file

반응형