如何发现 .js、.css 文件,文件系统(和 repo)中有啥,而 .csproj 中没有?
Posted
技术标签:
【中文标题】如何发现 .js、.css 文件,文件系统(和 repo)中有啥,而 .csproj 中没有?【英文标题】:How to discover .js, .css files, what are in the filesystem (and repo) but not in .csproj?如何发现 .js、.css 文件,文件系统(和 repo)中有什么,而 .csproj 中没有? 【发布时间】:2018-02-21 09:01:31 【问题描述】:上下文
我经常犯错误,忘记在 Asp Mvc 项目中包含供应商 .css 或 .js。我只是使用工具或从主题复制/下载并引用它们。一切都在本地工作,因为文件位于虚拟目录中,因此 IIS Express 将为它们提供服务。
当发布时间到来时,我发布了新版本,那些不在 .csproj 中的文件将不会被部署。
问题
虽然某些工具或 IDE 本身会在某些情况下创建警告,但如果在语法结构中我引用了 .csproj 中没有的资源,这并非全部有效(例如:当使用捆绑配置) 防止这种错误来源似乎很简单:只需使用精心挑选的过滤器检查文件系统并列出 .csproj 中未包含的所有文件。 (过滤器可以是:(*.css, .js, ...) 或 (assets/.*)
我怎样才能完成这项任务?
【问题讨论】:
您可以在解决方案资源管理器中进行交叉验证。它默认只列出解决方案映射文件 嗯,有数百个......在无数个文件夹中。我目前使用一种更好的方法,但效率仍然不够高:我在解决方案资源管理器中打开“显示所有文件”,所以我会看到没有包含的内容。仍然需要几分钟才能打开所有文件夹、子文件夹。如果有一个反向过滤器,比如只显示不包括在内,那就完美了 您使用的是哪个版本? VS 2015? 我正在使用 VS 2017 您必须编写某种脚本来解析 csproj 文件(它是 XML)并读取项目中包含的文件,然后读取相关文件夹,获取文件列表和将它们与项目列表进行比较。您可以在 c# 控制台应用程序中执行此操作。 【参考方案1】:如果切换到Visual Studio 2017支持的new .csproj
format,则不再需要在文件系统中添加对文件的引用,它们是默认拾取的,你必须排除您不想要的文件。
迁移到新的 .csproj
格式非常简单 - 您可以使用 dotnet migrate tool 进行转换。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net47</TargetFrameworks>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\MyProj\MyProj.csproj" />
</ItemGroup>
<ItemGroup>
<!-- /* Exclude files you don't want */ -->
<Compile Remove="Text\AnyTransliterator.cs" />
<Compile Remove="Text\BreakTransliterator.cs" />
</ItemGroup>
</Project>
如果您想要包含项目目录外部的文件,您可以创建指向文件或目录的链接。
<!-- /* Link to an individual file outside of the project */ -->
<Content Include="..\..\..\Assets\something.css" Link="Assets\something.css" />
<!-- /* Create a virtual directory in Visual Studio named Assets
and link to external Assets directory. All files in that
directory will be included in the project */ -->
<Content Include="..\..\..\Assets\**\*" LinkBase="Assets" />
<!-- /* Create a virtual directory in Visual Studio named Assets
and link to external Assets directory. Only .css files in that
directory will be included in the project */ -->
<Content Include="..\..\..\Assets\**\*.css" LinkBase="Assets" />
此适用于 .NET Framework,但请注意,除了 VS 2017 15.3 之外,您还需要安装 .NET Core SDK 2.0.0(并确保没有global.json
选择较低的 SDK版本)以使 LinkBase
选项起作用。
参考:New .csproj format - How to specify entire directory as "linked file" to a subdirectory?
【讨论】:
我喜欢这个答案,但仍然没有解决OP问题,有什么工具可以迁移吗? 如果文件默认或通过外部引用自动添加到.csproj
文件中,它们也将与项目一起自动部署。这不是OP的问题吗?
是的,但是迁移.csproj
文件并不容易。此外,该链接指定了核心项目。
否,该链接指定您需要 .NET Core SDK,但它会编译 .NET Framework 目标 - <TargetFrameworks>net47</TargetFrameworks>
。而且迁移并不难 - 有一个 tool 可以自动完成大部分迁移。
谢谢,这就是我想知道的。以上是关于如何发现 .js、.css 文件,文件系统(和 repo)中有啥,而 .csproj 中没有?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Laravel 中使用 app.js 和 app.css 修复错误 404?