3 回答
TA贡献1725条经验 获得超7个赞
我知道老线程,但是我找到了一种方法,但我一直忘了它,而在上次寻找它的搜索中,我偶然发现了这个问题。我发现最好的方法是使用.csproj文件中的BeforeBuild目标。
<Target Name="BeforeBuild">
<ItemGroup>
<Content Include="**\*.less" />
</ItemGroup>
</Target>
VS 2010不会涉及此部分,它可确保每次构建项目时文件都作为内容包含在内。
TA贡献1860条经验 获得超9个赞
您只需扩展您的网站.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中的内容项一起发布,因此我没有在我的答案中提出它。
TA贡献1802条经验 获得超5个赞
对于使用Chris的答案有问题的人,这是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>
非<Target>方法将指示Visual Studio 在解决方案资源管理器中显示文件。这一缺点是,对自动目录的任何操作都将导致Visual Studio覆盖通配符条目。还应注意,以下方法仅在VS中打开“解决方案/项目”后才会更新“解决方案资源管理器”。甚至解决方案资源管理器的“刷新”工具栏按钮也不会执行此操作。
<ItemGroup>
<Content Include="images\**" />
</ItemGroup>
- 3 回答
- 0 关注
- 659 浏览
添加回答
举报