如何发现 .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 目标 - &lt;TargetFrameworks&gt;net47&lt;/TargetFrameworks&gt;。而且迁移并不难 - 有一个 tool 可以自动完成大部分迁移。 谢谢,这就是我想知道的。

以上是关于如何发现 .js、.css 文件,文件系统(和 repo)中有啥,而 .csproj 中没有?的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap可以写后台管理系统界面吗

Magento 重复加载 JS CSS 文件

如何在 Laravel 中使用 app.js 和 app.css 修复错误 404?

IIS7的集成模式下如何让自定义的HttpModule不处理静态文件(.html .css .js .jpeg等)请求

Next.js - 导入 css 文件不起作用

web项目加载外部js和css文件时出错,老是无法加载