我注意到一些浏览器(特别是Firefox和Opera)非常热衷于使用.css和.js文件的缓存副本,即使在浏览器会话之间也是如此.当您更新其中一个文件但用户的浏览器继续使用缓存副本时,这会导致问题.
问题是:在更改文件时,强制用户浏览器重新加载文件的最优雅方法是什么?
理想情况下,解决方案不会强制浏览器在每次访问页面时重新加载文件.我会发布自己的解决方案作为答案,但我很好奇,如果有人有更好的解决方案,我会让你的投票决定.
更新:
在这里讨论了一段时间后,我发现John Millikin和da5id的建议很有用.事实证明,有一个术语:自动版本控制.
我在下面发布了一个新的答案,它是我原来的解决方案和John的建议的组合.
SCdF建议的另一个想法是将伪造的查询字符串附加到文件中.(一些Python代码自动使用时间戳作为伪造的查询字符串由pi提交.).但是,有一些关于浏览器是否会使用查询字符串缓存文件的讨论.(请记住,我们希望浏览器缓存文件并在以后的访问中使用它.我们只希望它在更改后再次获取文件.)
由于不清楚伪造的查询字符串会发生什么,我不接受这个答案.
我已经进行了广泛的搜索,但可能由于Android Studio和Gradle的新功能,我还没有找到任何关于如何执行此操作的说明.我想基本上完成本文中描述的内容,但使用Android Studio,Gradle和Windows而不是Eclipse和Linux.
我看到这个问题已经变得有点流行了.现在已经是我公认的Git使用年限了,从那以后我学到了很多东西.请,拜托之前,不管你会从这个Q&A得知事情对你的Git冒险阅读最后一段.
我想编写应用程序构建版本,该版本是从我所在的GIT分支名称(构建时)和自分支分歧后的提交数量自动派生的.我相信这对我的GIT存储库中的任何提交都是唯一的吗?分支名称是唯一的,并且提交沿着分支相互链接?如果我标记提交,我也可以使用该标记作为前缀.
在某种程度上git describe做我想要的,但它不包括我所在的分支名称,它包括缩写提交SHA-1哈希,我认为我不需要它,因为它不会添加任何东西到字符串的熵并且可能是多余的(我可能在这里错了,所以请纠正我).
我有什么选择?我在这里想的是正确的方向吗?当我有更多关于软件开发的重要事项时,我只是厌倦了为版本添加数字.
顺便说一下,我从来没有用肮脏的工作树建造.即我在构建公共发布之前总是将更改提交到存储库.
我现在知道 Git分支只是提交引用,因此,许多分支(和标记!)可能指向单个提交.因此,问题"这个提交属于哪个分支/谎言" 对Git 来说并不完全有效.Git 会跟踪你正在使用的"当前"分支 - 它已经为你检查过的分支 - 但同时任何数量的其他分支可能指向同一个提交,并且可以说没有任何一个分支可以被选择为"main"除非您想要表示当前已签出到磁盘的那个.请阅读本页面上的以下答案进行详细说明.
所以我正在阅读这篇有关CSS/JS文件的ASP.NET MVC中"autoversioning"的stackoverflow帖子,并想知道"最佳"策略是做什么的.
提供的解决方案插入一个程序集编号 - 这意味着每次发布 - 它将更改每个单个文件,这是不理想的,因为如果您只修改1*.css或*.js,那么它将更改每个文件.
1)如何仅针对"单个文件"而不是使用IIS7上的修改日期或其他内容进行站点范围组装?
2)如果我有某种"静态"资产 - 例如http://static.domain.com/js/123.js - 如果有人集成了这个静态,如何使用重写来发送请求的最新文件链接到他们的网站?
即http://static.domain.com/js/123.js是链接,当请求到来时 - 检查并发送最新文件?
我刚刚了解了SVN的WebDAV自动版本控制功能.虽然我知道这不是正确版本控制的替代品,但是消息记录了变更集,它让我感觉像是Dropbox的坚实而安全的替代品(减去漂亮的GUI和网页).但是,由于自动版本控制中的提交很频繁,我认为Git或Hg更适合这种情况,因为它们的数据库更紧凑(尽管我想知道事物的分布式特性是否会使自动化变得难以解决冲突).
据了解,这是一个使用Git或Hg实现的功能吗?
根据这里的问答,我想为在JBoss 5中运行的Web应用程序实现类似的自动版本系统.有什么东西可以用来做这种事情,还是我需要自己写一些东西?要明确:我没有使用PHP.
不太了解PHP,我不确定PHP的Tomcat/JBoss类似物.htaccess是什么.如果我必须编写自己的自动版本,我会从哪里开始?原理很清楚 - 使用文件的时间戳重写URL,但我不太了解使用JBoss/Tomcat进行URL重写.
1.自定义<my:script/>和<my:style/>标签,所以我不必在<c:url/>任何地方看到标签.
<%@ tag body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="src" required="true" rtexprvalue="true" %>
<script src="<c:url value="${src}" />"></script>
Run Code Online (Sandbox Code Playgroud)
2.相当紧随新手的步骤,但映射UrlRewriteFilter到/*在web.xml中:
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
3.向每个新会话(或多或少......)注入CACHE_BUST变量,应用程序部署 timestamp:
// On application deploy:
long CACHE_BUST = System.currentTimeMillis() / 1000;
// later...
session.setAttribute("cacheBust", CACHE_BUST);
Run Code Online (Sandbox Code Playgroud)
4. ...so that I can use these rules in urlrewrite.xml …
这个问题在LaTeX文档的标题中添加版本号激发了我的好奇心:
如何在Latex中添加自动版本号?
(所以有人不是这样做的{\bf Version:} 1.2,然后是{\bf Version:} 1.2 1.3)?
我想版本化我的asp.net核心应用程序.
我按照以下链接:http://www.matthiaseinig.de/2013/05/20/auto-generate-fileversion-for-all-projects-in-a-solution-with-t4/,但我想删除项目装配信息,但我没有找到它.
如何删除重复的程序集信息?我想用另一个文件覆盖asp核心程序集.
过了一会儿,我意识到最好的解决方案是使用T4文件,每次构建后版本会自动递增.
看这里:
auto-versioning assembly-attributes .net-assembly .net-core asp.net-core
我想在每次发布apk时更改android:versionName.
是否有任何eclipse插件或其他一些方法可以帮助它自动更改我的代码的编译?
例如,今天是10/09/2011,我希望AndroidManifest.xml中的android:versionName值设置为1.0.0.1009
在Delphi XE2中,自动生成的构建号功能现在使用某种日期和时间生成的值,如下所示:
2.4.4386.838
每次构建时最后两个数字都会更改,并且基于当前日期和时间:
Major = 2 (user defined)
Minor = 4 (user defined)
Release = 4386 (number of days since Jan 1 2000)
Build = 838 (number of seconds since 00:00:00)
Run Code Online (Sandbox Code Playgroud)
我想这个发布和构建数字的新格式是从.NET实现中借用的,它实现了非常相似的功能.在.net中,最后一个数字(Build)等于自当地时间午夜以来的秒数除以2.有关.net实现的详细信息,请参阅此链接:艰难地确定构建日期
如果可以依靠这种方式保持这种方式,那么现在我们有更好的方法来确定编译时间而不是
使用IDE插件
使用PE Headers hacks
问题不在于如何返回旧的自动增量版本号功能.
问题是 XE2是否确实使用了上面显示的日期和时间,从2010年1月1日开始,在Build和Release数字中添加了几天和几秒?
auto-versioning ×10
git ×3
android ×2
caching ×2
.net-core ×1
asp.net-core ×1
asp.net-mvc ×1
css ×1
delphi ×1
delphi-xe2 ×1
gradle ×1
javascript ×1
jboss ×1
latex ×1
mercurial ×1
parsing ×1
tomcat ×1
versioning ×1
webdav ×1