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

有帮助吗?

解决方案

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

<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的里面的内容项目一起发布,所以我现在也没有在我的答案。

对于那些使用时遇到问题的人 克里斯的回答, ,这是 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, , ETC。 任何 文件扩展名将起作用
  • **\*.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提示

声明

您可以使用像这样的链接添加文件,它们是搜索,浏览,能干,但如果你试图改变他们,也视觉工作室叶通配符代替他们没有结帐:

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

此而来的.proj文件内。

据我所知;然而,我的建议是将它们粘贴到项目中,因为这会在默认情况下包括它们。因此,而不是将其粘贴到浏览器通过目录,使用Visual Studio将文件粘贴到文件夹中。

我意识到该最溶液通过一个手动添加文件,一个。如果您有数百人因为我做的只是一个几个小时的事。有趣的是,即使在2016年2015年VS这一严重的问题仍然没有得到解决。啊,我多么爱的Xcode。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top