콘텐츠 파일을 asp.net 프로젝트 파일에 자동으로 포함하는 방법이 있습니까?
ASP.NET 프로젝트에 많은 콘텐츠 파일 (주로 이미지 및 js)을 자주 추가합니다. 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 \ ... 에 게시되었으며 .csproj 내의 내용 항목과 함께 게시하도록 설득 할 수 없었으므로 내 대답에 표시하지 않았습니다.
Chris의 답변을 사용하는 데 문제 가있는 경우 Visual Studio 2012 이상을위한 솔루션입니다.
<Target Name="ContentsBeforeBuild" AfterTargets="BeforeBuild">
<ItemGroup>
<Content Include="images\**" />
</ItemGroup>
</Target>
크리스는 그의 대답에 언급 한 바와 같이 - 비주얼 스튜디오가 되지 않습니다 이 눌러 <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>
비 <Target>
접근 방식 은 Visual Studio에 솔루션 탐색기 내에 파일 을 표시 하도록 지시 합니다. 이 방법의 단점은 자동 디렉터리를 조작 하면 Visual Studio가 와일드 카드 항목을 재정의하게된다는 것입니다. 아래의 접근 방식 은 VS에서 솔루션 / 프로젝트를 열 때만 솔루션 탐색기를 업데이트합니다. 솔루션 탐색기의 "새로 고침"도구 모음 단추조차도이를 수행하지 않습니다.
<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>
작은 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 문을 생성해야합니다.
You can add files with links like this, they are searchable, view-able, but they do not checkout if you try to change them, also visual studio leaves the wildcards in place:
<ItemGroup>
<Content Include="..\Database Schema\Views\*.sql">
<Link>Views\*.sql</Link>
</Content>
</ItemGroup>
This goes inside the .proj file.
Not to my knowledge; however my suggestion is to paste them into the project as this will include them by default. So, instead of pasting them into the directory via Explorer, use Visual Studio to paste the files into the folders.
I realized that best solution for this is manually add files, one by one. If you have hundreds of them as I did it was just a matter of few hours. Funny that even in 2016 with VS 2015 this serious problem is still not solved. Ahh, how I love Xcode.
'development' 카테고리의 다른 글
gnuplot : 여러 입력 파일의 데이터를 단일 그래프로 플로팅 (0) | 2020.10.11 |
---|---|
예외 또는 반환 코드를 선호하는 이유는 무엇입니까? (0) | 2020.10.11 |
텍스트 상자가 비활성화되어 있는지 또는 jquery를 사용하지 않는지 찾기 (0) | 2020.10.11 |
MySQL에서 엔진별로 테이블 표시 (0) | 2020.10.11 |
PostgreSQL, "오늘"을 기준으로 날짜 확인 (0) | 2020.10.11 |