【问题标题】:How to handle changing URLs in CSS local vs. production如何在 CSS 本地与生产中处理更改的 URL
【发布时间】:2011-10-26 06:23:11
【问题描述】:

我们使用 Visual Studio 2010,在生产环境中,我们将大量资源放在 CDN 上。但是,当我们在本地调试时,我们希望从相对本地路径中拉取资源。

所以在我们的 CSS 中,我希望我们的 CSS 能够像我在本地运行时一样:

.foo {
    background:url(../images/bar.jpg);
}

但是,当我发布到 Azure 时,我希望 CSS 自动更新路径:

.foo {
    background:url(http://cdn.company.com/website/images/bar.jpg);
}

这在 Visual Studio 2010 中是否可行?

【问题讨论】:

    标签: asp.net visual-studio visual-studio-2010 asp.net-mvc-3


    【解决方案1】:

    我意识到这可能不是您要寻找的答案,但作为参考,您可以使用 MSBuild Community Tasks 中的 FileUpdate 任务执行此操作,看起来像这样:

    <PropertyGroup>
        <Configuration>Debug</Configuration>
        <TargetAddress>../images</TargetAddress>
        <TargetAddress Condition="'$(Configuration)'=='Release'">http://cdn.company.com/website/images</TargetAddress>
    </PropertyGroup>
    
    <Target Name="DeployCSS">
        <ItemGroup>
          <ScriptFiles Include=".\css\*.css"></ScriptFiles>
        </ItemGroup>
        <Copy SourceFiles="@(ScriptFiles)" DestinationFiles="@(ScriptFiles->'$(DeployPath)css\%(Filename)%(Extension)')"></Copy>
        <FileUpdate Encoding="ASCII" Files="@(ScriptFiles->'$(DeployPath)css\%(Filename)%(Extension)')" Regex="\.\./images" ReplacementText ="$(TargetAddress)"/>
    </Target>
    

    【讨论】:

    • 您写道“我意识到这可能不是您要寻找的答案”。为什么 ?这是唯一正确的过程和解决方案。
    • @Softion 主要是因为我不认为它是 in 视觉工作室的东西。 Though one can change that, I now know.
    • 正则表达式文件替换绝对是要走的路。但是 CSS 路径是相对的,这一点毫无价值,因此仅重定位 CSS 文件并为资产保持相同的文件夹结构比仅重定位 CSS 引用的资产更容易。
    • 谢谢,这正是我要找的东西,很高兴您链接到外部文章,展示如何在 VS 中使用 MSBuild。
    • 没有 Visual Studio 的解决方案是切换主机:使用专用域对所有资产使用绝对引用,在开发人员机器上设置此域以使用 hosts 文件转到内部通用机器。资产不会在 TFS 中,但谁在乎,因为您不应该通过覆盖它来更改资产(因为公共缓存)所以您没有使用版本控制。
    【解决方案2】:

    先生,您来了。与大多数开发人员一样,我建议为您需要处理的各种应用程序使用单独的样式表。 ;)

    您可以像这样在

    中简单地将文字添加到您的标记中......
    <asp:Literal ID="DynamicCSS" runat="server"></asp:Literal>
    

    然后使用以下代码根据请求来源动态加载它们。

    Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        If Request.Url.Host = "localhost" Then
            DynamicCSS.Text = "<link type=""text/css"" rel=""Stylesheet"" href=""Styles/style1.css"" />"
        Else
            DynamicCSS.Text = "<link type=""text/css"" rel=""Stylesheet"" href=""Styles/style2.css"" />"
        End If
    End Sub
    
    private void Page_Init(object sender, System.EventArgs e) {
        if (Request.Url.Host == "localhost") {
            DynamicCSS.Text = "<link type=\"text/css\" rel=\"Stylesheet\" href=\"Styles/style1.css\" />";
        } else {
            DynamicCSS.Text = "<link type=\"text/css\" rel=\"Stylesheet\" href=\"Styles/style2.css\" />";
        }
    }
    

    注意:我没有测试 C# 代码,但我想它应该可以正常工作。干杯 ;)

    【讨论】:

    • 我不想复制样式表并管理两者的更改。相反,我希望有一个带有替换变量的问题中描述的样式表。
    【解决方案3】:

    您可以将基本 url 放在 web.config 文件中,并使用 web config 转换根据它的发布位置对其进行修改。

    一些文档: http://msdn.microsoft.com/en-us/library/dd465326.aspx

    【讨论】:

    • 没有人说 CSS 必须是静态的。这是ASP.net,可以在服务器端生成。
    • 一个例子似乎是有序的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2022-09-30
    • 2017-02-06
    • 2013-04-21
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多