有没有办法自动将内容文件包含到asp.net项目文件中?

时间:2010-03-31 07:23:30

标签: asp.net msbuild csproj

我经常在我的ASP.NET项目中添加大量内容文件(主要是图像和js)。我正在使用VS发布系统,在发布之前,新文件在我将它们包含在项目中之前不会发布。我想自动包含指定目录中的所有文件。有没有办法指定哪些目录应该自动包含在csproj文件中或其他任何地方?

8 个答案:

答案 0 :(得分:125)

旧线程,我知道,但是我找到了一种方法来做到这一点,我一直在忘记,并且在我的搜索中最后一次找到它,我偶然发现了这个问题。我发现的最好方法是在.csproj文件中使用BeforeBuild目标。

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

VS 2010不会触及此部分,并确保每次构建项目时都将文件作为内容包含在内。

答案 1 :(得分:49)

您只需扩展您的网站.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中的内容项一起发布,所以我没有呈现它在我的回答中。

答案 2 :(得分:14)

对于那些使用Chris' answer时出现问题的人来说,这是Visual Studio 2012及更新版本的解决方案:

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

正如Chris在他的回答中提到的那样 - 即使您手动操作(添加/删除文件)目标目录,Visual Studio 也不会触摸此<Target>部分。

请注意,您应该包含文件所在的子目录(在上面的例子中,它是images)。 Visual Studio / MSBuild会将这些文件放在项目结构中的同一目录中。如果您不使用子目录,则文件将放在项目结构的根目录中。

快速解释通配符:

  • **表示所有递归(文件,子目录及其中的文件)
  • *.ext将在顶级目录中包含扩展名为ext的所有文件,但不包含子目录
    • 例如,*.ext可以是*.png*.js等。任何文件扩展名都可以使用
  • **\*.ext将包含顶级目录和所有子目录中扩展名为ext的所有文件。
  • 请参阅How do I use Nant/Ant naming patterns?的答案,了解有关示例的更完整说明。

完成后,请注意使用<Target>与不使用它之间存在差异。

使用<Target>方法,Visual Studio 不会显示解决方案资源管理器中的文件。

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

<Target>方法指示Visual Studio 显示解决方案资源管理器中的文件。这个的缺点是任何对自动目录的操作都会导致Visual Studio覆盖通配符条目。还应注意,在VS中打开解决方案/项目时,下面的方法将 更新解决方案资源管理器。即使是Solution Explorer的“刷新”工具栏按钮也不会这样做。

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

答案 3 :(得分:7)

您可以使用框架的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>

答案 4 :(得分:3)

我已经写了我如何能够获得使用小型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语句

答案 5 :(得分:2)

您可以添加带有这样的链接的文件,它们是可搜索的,可查看的,但是如果您尝试更改它们,它们也不会结帐,Visual Studio也会保留通配符:

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

这是在.proj文件中。

答案 6 :(得分:1)

据我所知;但是我的建议是将它们粘贴到项目中,因为默认情况下它们会包含它们。因此,不要通过资源管理器将它们粘贴到目录中,而是使用Visual Studio将文件粘贴到文件夹中。

答案 7 :(得分:-1)

我意识到最好的解决方案是逐个手动添加文件。如果你像我一样有数百个,那只需几个小时。有趣的是,即使在2016年与VS 2015这个严重的问题仍然没有解决。啊,我喜欢Xcode。