ฉันเจอปัญหาเดียวกันมาก
ในระยะสั้น:
- ยินดีที่จะมี CSS ดั้งเดิมใน dir "ภายใน" (ทรัพยากร / สินทรัพย์ / css / a.css)
- ยินดีที่จะมีภาพใน dir "สาธารณะ" (แหล่งข้อมูล / public / images / devil.png)
- ด้วยความเต็มใจที่จะรับ CSS นั้นมาคอมไพล์ใหม่ในเว็บ / css / a.css และทำให้มันชี้ภาพใน /web/bundles/mynicebundle/images/devil.png
ฉันได้ทำการทดสอบด้วยชุดค่าผสมที่เป็นไปได้ทั้งหมดดังต่อไปนี้:
- @ หมายเหตุสัญกรณ์สัมพัทธ์
- แยกวิเคราะห์ด้วย cssrewrite โดยไม่มีมัน
- พื้นหลังภาพ CSS เทียบกับแท็ก <img> โดยตรง src = เป็นภาพเดียวกันกับ CSS
- CSS แยกวิเคราะห์ด้วย assetic และยังไม่มีการแยกวิเคราะห์ด้วยเอาต์พุตโดยตรง assetic
- และทั้งหมดนี้คูณด้วยการลองใช้ "public dir" (as
Resources/public/css
) กับ CSS และไดเรกทอรี "private" (as Resources/assets/css
)
สิ่งนี้ทำให้ฉันมีชุดค่าผสมทั้งหมด 14 ชุดบนกิ่งไม้เดียวกันและเส้นทางนี้เปิดตัวจาก
- "/app_dev.php/"
- "/app.php/"
- และ "/"
จึงให้การทดสอบ 14 x 3 = 42
นอกจากนี้ทั้งหมดนี้ได้รับการทดสอบการทำงานในไดเร็กทอรีย่อยดังนั้นจึงไม่มีทางที่จะหลอกโดยการให้ URL ที่สมบูรณ์เพราะจะไม่ได้ผล
การทดสอบเป็นภาพที่ไม่มีชื่อสองภาพจากนั้นจึงตั้งชื่อ div จาก 'a' ถึง 'f' สำหรับ CSS ที่สร้างจากโฟลเดอร์สาธารณะและตั้งชื่อว่า 'g ถึง' l สำหรับภาพที่สร้างจากเส้นทางภายใน
ฉันสังเกตสิ่งต่อไปนี้:
มีการทดสอบเพียง 3 รายการจากทั้งหมด 14 รายการเท่านั้นที่แสดงอย่างเพียงพอใน URL ทั้งสามรายการ และไม่มีมาจากโฟลเดอร์ "ภายใน" (ทรัพยากร / สินทรัพย์) เป็นข้อกำหนดเบื้องต้นที่จะต้องมี CSS PUBLIC สำรองจากนั้นสร้างด้วย assetic จากที่นั่น
นี่คือผลลัพธ์:
เปิดผลลัพธ์ด้วย /app_dev.php/
เปิดผลลัพธ์ด้วย /app.php/
เปิดผลลัพธ์ด้วย /
ดังนั้น ... เท่านั้น - ภาพที่สอง - Div B - Div C เป็นไวยากรณ์ที่อนุญาต
นี่คือรหัส TWIG:
<html>
<head>
{% stylesheets 'bundles/commondirty/css_original/container.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{# First Row: ABCDEF #}
<link href="{{ '../bundles/commondirty/css_original/a.css' }}" rel="stylesheet" type="text/css" />
<link href="{{ asset( 'bundles/commondirty/css_original/b.css' ) }}" rel="stylesheet" type="text/css" />
{% stylesheets 'bundles/commondirty/css_original/c.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets 'bundles/commondirty/css_original/d.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/public/css_original/e.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/public/css_original/f.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{# First Row: GHIJKL #}
<link href="{{ '../../src/Common/DirtyBundle/Resources/assets/css/g.css' }}" rel="stylesheet" type="text/css" />
<link href="{{ asset( '../src/Common/DirtyBundle/Resources/assets/css/h.css' ) }}" rel="stylesheet" type="text/css" />
{% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/i.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/j.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/assets/css/k.css' filter="cssrewrite" %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
{% stylesheets '@CommonDirtyBundle/Resources/assets/css/l.css' %}
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
{% endstylesheets %}
</head>
<body>
<div class="container">
<p>
<img alt="Devil" src="../bundles/commondirty/images/devil.png">
<img alt="Devil" src="{{ asset('bundles/commondirty/images/devil.png') }}">
</p>
<p>
<div class="a">
A
</div>
<div class="b">
B
</div>
<div class="c">
C
</div>
<div class="d">
D
</div>
<div class="e">
E
</div>
<div class="f">
F
</div>
</p>
<p>
<div class="g">
G
</div>
<div class="h">
H
</div>
<div class="i">
I
</div>
<div class="j">
J
</div>
<div class="k">
K
</div>
<div class="l">
L
</div>
</p>
</div>
</body>
</html>
container.css:
div.container
{
border: 1px solid red;
padding: 0px;
}
div.container img, div.container div
{
border: 1px solid green;
padding: 5px;
margin: 5px;
width: 64px;
height: 64px;
display: inline-block;
vertical-align: top;
}
และ a.css, b.css, c.css ฯลฯ : เหมือนกันทั้งหมดเพียงแค่เปลี่ยนสีและตัวเลือก CSS
.a
{
background: red url('../images/devil.png');
}
โครงสร้าง "ไดเรกทอรี" คือ:
ไดเรกทอรี
ทั้งหมดนี้เกิดขึ้นเพราะฉันไม่ต้องการให้ไฟล์ต้นฉบับแต่ละไฟล์เปิดเผยต่อสาธารณะโดยเฉพาะหากฉันต้องการเล่นกับฟิลเตอร์ "น้อย" หรือ "sass" หรือที่คล้ายกัน ... ฉันไม่ต้องการให้ "ต้นฉบับ" ของฉันเผยแพร่เฉพาะ รวบรวมหนึ่ง
แต่มีข่าวดี . หากคุณไม่ต้องการมี "CSS สำรอง" ในไดเรกทอรีสาธารณะ ... อย่าติดตั้งด้วย--symlink
แต่ทำสำเนาจริงๆ เมื่อ "assetic" สร้าง CSS แบบผสมและคุณสามารถลบ CSS ดั้งเดิมออกจากระบบไฟล์และออกจากภาพ:
กระบวนการรวบรวม
หมายเหตุฉันทำสิ่งนี้เพื่อ--env=prod
สิ่งแวดล้อม
ความคิดสุดท้ายเพียงไม่กี่:
พฤติกรรมที่ต้องการนี้สามารถทำได้โดยการมีรูปภาพในไดเรกทอรี "สาธารณะ" ในGitหรือMercurialและ "css" ในไดเร็กทอรี "assets" นั่นคือแทนที่จะให้พวกเขาอยู่ใน "สาธารณะ" ตามที่แสดงในไดเร็กทอรีให้ลองนึกภาพ a, b, c ... อาศัยอยู่ใน "assets" แทนที่จะเป็น "public" แทนที่จะมีโปรแกรมติดตั้ง / ตัวปรับใช้ของคุณ (อาจเป็นBash script) เพื่อวาง CSS ไว้ใน dir "สาธารณะ" ชั่วคราวก่อนที่assets:install
จะดำเนินการจากassets:install
นั้นassetic:dump
จากนั้นจึงดำเนินการลบ CSS ออกจากไดเรกทอรีสาธารณะโดยอัตโนมัติหลังจากที่assetic:dump
ดำเนินการแล้ว สิ่งนี้จะบรรลุพฤติกรรมที่ต้องการในคำถามอย่างแน่นอน
อีกวิธีหนึ่ง (ไม่ทราบว่าเป็นไปได้) คือการสำรวจว่า "สินทรัพย์: ติดตั้ง" สามารถใช้ "สาธารณะ" เป็นแหล่งที่มาเท่านั้นหรืออาจใช้ "เนื้อหา" เป็นแหล่งที่มาเพื่อเผยแพร่ ซึ่งจะช่วยได้เมื่อติดตั้ง--symlink
ตัวเลือกเมื่อพัฒนา
นอกจากนี้หากเราจะเขียนสคริปต์การลบออกจากผบ. "สาธารณะ" ความจำเป็นในการจัดเก็บไว้ในไดเรกทอรีแยกต่างหาก ("ทรัพย์สิน") จะหายไป พวกเขาสามารถอยู่ภายใน "สาธารณะ" ในระบบควบคุมเวอร์ชันของเราได้เนื่องจากจะถูกทิ้งเมื่อนำไปใช้งานต่อสาธารณะ นี้ยังช่วยให้การ--symlink
ใช้งาน
แต่อย่างไรก็ตามข้อควรระวังในตอนนี้:เนื่องจากตอนนี้ต้นฉบับไม่ได้อยู่ที่นั่นอีกต่อไป (rm -Rf
) มีเพียงสองวิธีไม่ใช่สามวิธี div ที่ทำงาน "B" ไม่ทำงานอีกต่อไปเนื่องจากเป็นการเรียกเนื้อหา () โดยสมมติว่ามีเนื้อหาดั้งเดิม เฉพาะ "C" (อันที่คอมไพล์) เท่านั้นที่จะใช้งานได้
ดังนั้น ... มีเพียงผู้ชนะรอบสุดท้ายเท่านั้น: Div "C" อนุญาตให้ตอบคำถามในหัวข้อนี้ได้อย่างถูกต้อง: ในการรวบรวมโปรดเคารพเส้นทางไปยังรูปภาพและอย่าเปิดเผยแหล่งที่มาต้นฉบับต่อสาธารณะ
ผู้ชนะคือ C